【Java】2つのthisの違い

Javaの学習しているとthisという文法が登場します。

本記事では、Javaに登場する2つのthisについての違いを紹介します。

結論

thisは、自身のインスタンスを表す意味と同一クラスのコンストラクタを呼び出す意味があります。

では、この2つの意味を詳しく見ていきます。

自身のインスタンスを表すthis

以下のコードは、メンバをthisで表しています。

public class Main{
    public static void main(String[] args){
        Greet jp = new Greet();
        jp.hello();
    }
}
class Greet{
    name = "tanaka";
    public void output(){
        System.out.println("Hello," + this.name + "."); //Hello, tanaka.
    }
  public void hello(){
        this.output();
   }
}

10行目のthis

このthisは、この場合、「Greetクラス」という意味になります。

また、ドットは、~のという意味であり、

this.nameは、Greetクラスのnameフィールドということになります。

13行目のthis

この場合、Greetクラスのoutputメソッドという意味になります。

thisの省略

上のコードでは、必ずしもthisを書く必要はありません。

thisの省略についてみていきます。

public class Main{
    public static void main(String[] args){
        Greet jp = new Greet();
        jp.hello("kondo");
    }
}
class Greet{
    name = "tanaka";
  public void hello(String name){
        System.out.println("Hello. " + name + "."); //Hello, kondo.
        System.out.println("Hello. " + this.name + "."); //Hello, tanaka.
   }
}

10行目は、thisを省略し、11行目は、thisがあります。

10行目のnameは、ローカル変数であるname=”kondo”を指します。

11行目のnameは、Greetクラスのname=”tanaka”を指します。

このようにクラスのメソッド内とクラスで同一の変数がある場合、ローカル変数が優先されます。

つまり、

クラスの変数を呼び出すとき、

クラスのメソッド内とクラスで同一の変数がある場合、thisを省略することはできません。

そうではない場合、thisを省略してもクラスの変数が呼び出されます。

私の一個人の意見としては、省略できる場合でも、thisを用いてインスタンス自身のメンバを使うことを明示したほうが良いと思います。

同一クラスのコンストラクタを呼び出すthis

以下のような複数のコンストラクタがあるとする。

public class Person{
	String name;
	int height;

	public Person(String name, int height){
		this.name = name;
		this.height = height;
	}
	public Person(int height){
		this.name = "tanaka";
		this.height = 170;
	}
	public Person(){
		this.name = "tanaka";
		this.height = 170;
	}
}

この煩雑なコンストラクタをthisを用いると簡潔に記述できる。

public class Person{
	String name;
	int height;
	public Person(String name, int height){
		this.name = name;
		this.height = height;
	}
	public Person(String name){
		this(name,170);
	}
	public Hero(int height){
		this("tanaka",height);
	}
	public Hero(){
		this("tanaka",170);
	}
}

9行目、12行目、15行目のthisは、それぞれの4行目のコンストラクタを呼び出している。

こうすることで、同じような記述を省略することができる。