【はじめてのJava】インスタンス変数の使い方(値の代入)【オブジェクトとクラス編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
オブジェクトとクラス編
オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。
前回は「インスタンス変数」について扱いました。
今回は「インスタンス変数の使い方(値の代入方法)」について扱っていきます。
目次
インスタンス変数の使い方
インスタンス変数は インスタンス化を行うことで利用できるようになります 。
どういうことか見ていきましょう。
今まで使ってきた変数は、変数の定義と同時に実体が作成されていました。そのため、宣言した瞬間に利用可能になっていたのです。
しかし、インスタンス変数は状況が異なります。インスタンス変数は定義した段階ではあくまで「設計図」の状態です。設計図の状態では実体が存在しません。
↓この状態ではただの設計図です。
そこで、インスタンス変数を利用するためにはインスタンスを準備する必要があります。そのため、まずインスタンス化する必要があるのです。
【補足】newを用いたインスタンス化でなくとも、インスタンスさえ取得できればOKです。ただし、非常に高度な内容で入門編の内容とかけ離れるためここでは触れません。
インスタンスが準備できたらインスタンス変数に値を代入することができます。(具体的なソースコード上の書き方は後程紹介します。)
インスタンス変数に値を代入する
では実際にインスタンス変数への値の代入方法を説明していきます。今回もCarクラスを基に考えていきます。ただし、あまりCarクラスの中身が多いとややこしいので、Carクラスの中身はdouble型の変数speedとString型の変数colorだけで考えていきましょう。
Carクラスの定義は以下の通りです。なお、今回の記事ではCarクラスはこれ以降変更しません。
class Car{ double speed; String color; }
この状態では、Carクラスはまだ設計図の状態です。
ここからインスタンス化を行います。インスタンス化は他のクラスで行います。そこでもう一つMyCarDriveクラスを準備しましょう。MyCarDriveクラスには実行できるようにmainメソッドを入れておきましょう。
以下のような感じです。
public class MyCarDrive{ public static void main(String[] args){ } }
なお、mainメソッドの内容が何もないため、コンパイルはできますが実行しても何も起こりません。
インスタンス化する
まずはインスタンス化を行います。インスタンス化を行うと次の画像のような状態になります。
インスタンス化の方法は次の通りです。
new Car(); //Carクラスをインスタンス化している
以上を踏まえてMyCarDriveクラスを修正すると以下の通りです。
public class MyCarDrive{ public static void main(String[] args){ new Car(); //Carクラスをインスタンス化している } }
なお、ここまで書いても、System.out.println()などの表示箇所がないため、コンパイルはできますが実行しても何も起こりません。
インスタンスを変数で保持する
これでインスタンス化ができたので、続けて値の代入…と行きたいところですが、ここで一つ問題が発生します。インスタンス化したCarに名前がないため、使いたくてもどうやって使えばいいのかわからない状態です。
そこで、インスタンス化したCarを変数名で識別できるようにしましょう。次の画像のように、インスタンス化したCarをmyCarという変数名で使えるようにします。
そのため、いったんソースコードを以下のように変更してみます。一見良さそうに見えますが、実はこのソースコードには罠が潜んでいます。
myCar = new Car(); //Carクラスをインスタンス化している
これでインスタンス化したCarをmyCarという識別子で利用できる…と思いたいのですが、実はこの状態ではコンパイルエラーを起こします。
なぜならば、これだけではmyCarという変数のデータ型がわからないためです。Javaでは変数には必ずデータ型が必要です。
では、myCarのデータ型は何になるのでしょうか。myCarは、「Carクラスをインスタンス化したもの」を保持するための変数です。ということは、Carクラスを基にして作られたオブジェクトということになります。ですので基になったCarをそのままmyCarのデータ型として指定すればOKです。
書き方は以下の通りです。
Car myCar = new Car(); //Carクラスをインスタンス化している
改めてMyCarDriveクラスを書き直すと以下の通りです。
public class MyCarDrive{ public static void main(String[] args){ Car myCar = new Car(); //Carクラスをインスタンス化している } }
なお、ここまで書いても、先ほど同様、System.out.println()などの表示箇所がないため、コンパイルはできますが実行しても何も起こりません。
インスタンス変数に値を代入する
インスタンス化ができたので、いよいよ値を代入します。値の代入が終わると、次の画像のようにmyCarにspeedやcolorが設定されます。
代入の方法は以下の通りです。なお、この方法はカプセル化と呼ばれる観点で考えると望ましい方法ではありません。詳しくはアクセス修飾子やカプセル化と呼ばれる部分で扱いますので今はこの方法で進めましょう。
インスタンス名.インスタンス変数名 = 値;
例えば、myCarのspeedを30.0にしたい場合は以下のように書きます。
myCar.speed = 30.0; //myCarのspeedを30.0にしている
同様に、myCarのcolorをredにしたい場合は以下のように書きます。
myCar.color = "red"; //myCarのcolorを"red"にしている
代入部分をMyCarDriveに反映すると次のようになります。
public class MyCarDrive{ public static void main(String[] args){ Car myCar = new Car(); //Carクラスをインスタンス化している myCar.speed = 30.0; //myCarのspeedを30.0にしている myCar.color = "red"; //myCarのcolorを"red"にしている } }
これで値の代入ができました。ただし、System.out.println()などの表示箇所がないため、コンパイルはできますが実行しても何も起こりません。
サンプルソース
今回の最終的なサンプルソースは以下の通りです。
コンパイルや実行時の注意点はこちらの記事のサンプルソースを参考にしてください。
Car.java
class Car{ double speed; String color; }
MyCarDrive.java
public class MyCarDrive{ public static void main(String[] args){ Car myCar = new Car(); //Carクラスをインスタンス化している myCar.speed = 30.0; //myCarのspeedを30.0にしている myCar.color = "red"; //myCarのcolorを"red"にしている } }
まとめ
インスタンス変数はクラスを定義しただけでは使用できない。
インスタンス変数はインスタンス化すると使用できる。
インスタンス変数への代入は「インスタンス名.インスタンス変数名 = 値;」で代入可能。
(おまけ:「インスタンス名.インスタンス変数名 = 値;」という利用方法は、カプセル化の観点からは好ましくない。)
次回
次回はインスタンス変数に代入した値の利用方法について詳しく触れていきます。
はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら