Java インスタンスフィールドがややこしい

メソッド内でインスタンスフィールドにアクセスしたりと、ファイル間を言ったり来たりするのがわかりにくい。

最初から一つ一つ整理して見ていく。

 

インスタンスを生成し、変数に代入

Main.java

class Main {
public static void main(String[] args) {
 Vehicle vehicle = new Vehicle();
}

黄色Vehicle部:クラス型

ピンクvehicle部:変数名

青部:インスタンス生成

 

Vehicle.java

class Vehicle {

}

 

 

インスタンスメソッドの定義と呼び出し

Main.java

class Main {
public static void main(String[] args) {
 Vehicle vehicle = new Vehicle();
vehicle.run();
}

 

青部:インスタンス名.メソッド名() ;

これでメソッド呼び出している

 

Vehicle.java

class Vehicle {
public void run() {
System.out.println("速い");
}
}

緑void:戻り値の型

紫run部:メソッド名

 

インスタンスフィールドの定義

tMain.java

class Main {
public static void main(String[] args) {
 Vehicle vehicle = new Vehicle();
vehicle.name = "road star";
vehicle.run();
}

 ピンク部:インスタンス名.フィールド名 = 〇〇 でnameフィールドへ値をセットしている

 

Vehicle.java

class Vehicle {
public String name;
publi
c void run() {
System.out.println("速い");
}
}

 

青部:インスタンスフィールド を定義

(String name は名前を入れる変数を定義している)

 

④クラスの中でインスタンスを使う

Main.java

class Main {
public static void main(String[] args) {
 Vehicle vehicle = new Vehicle();
vehicle.name = "road star";
vehicle.run();
}

 

Vehicle.java

class Vehicle {
public String name;
publi
c void run() {
System.out.println(this.name + "は速い");
}
}

 

ピンク部:「this」という特殊変数を使う

runメソッド内でnameのインスタンスフィールドにアクセスするためにこの「this」という特殊変数を使い、これはクラス内のメソッドの定義の中でのみ使用可能。
thisはメソッドが呼ばれた時に、そのメソッドを呼び出しているインスタンスに置き換えられる…(これがちょっとややこしく感じる)

 

実行結果として

road starは速い

と出る。

 

ところでインスタンスフィールドが増えると毎回値をセットしないといけないので手間がかかる。
ここでインスタンスフィールドへ値をセットする楽な方法がコンストラクタとなっている。

 

⑤コンストラクタの定義

コンストラクタ:newを使ってインスタンス生成した後に自動で呼び出されるメソッド。Rails で言うところのinitializeメソッドみたいなもの?

Main.java

class Main {
public static void main(String[] args) {
 Vehicle vehicle = new Vehicle("road star");
vehicle.run();
}

ピンク部:インスタンスを生成するときにインスタンスフィールドへセットする値"road star"を引数として渡している

 

Vehicle.java

class Vehicle {
public String name;
Vehicle(String name) {
this.name = name;
}
publi
c void run() {
System.out.println(this.name + "は速い");
}
}

 

カラー部:コンストラクタを定義している

青Vehicle部:クラス名

黄色(String name)部:文字のnameを引数として受け取る

紫this.name = name部:nameインスタンスフィールドにthisメソッドで引数を受け取って値をセットしている

 

 

ということで一つ一つ見ると何となく分かるが、いきなりコードを見ても中々理解できない。

一つ一つと丁寧に見ていこう