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;
public 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;
public 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;
}
public void run() {
System.out.println(this.name + "は速い");
}
}
カラー部:コンストラクタを定義している
青Vehicle部:クラス名
黄色(String name)部:文字のnameを引数として受け取る
紫this.name = name部:nameインスタンスフィールドにthisメソッドで引数を受け取って値をセットしている
ということで一つ一つ見ると何となく分かるが、いきなりコードを見ても中々理解できない。
一つ一つと丁寧に見ていこう