【Java】同一クラスで、他インスタンスのprivate変数にアクセスができる

どうも。
JavaSliverの資格を取るために勉強を開始しました。

勉強してみると、意外と自分が理解していなかったことが多く出ていて
改めて知識に加えられてとても楽しいです。

資格勉強中に新たな発見となったことを記事に書き起こそうと思います。

コンパイルエラーが起きると思ったソースコード

資格の勉強中以下のような問題に当たりました。
「以下のロジックはコンパイルエラーが起きるか否か」
※本当はもっと違うのですが、シンプルにまとめるため・・・

Sample.java


public class Sample {

	private int num;
	
	public Sample(int num) {
		this.num = num;
	}
	
	public boolean isTestTest(Object obj) {
		if (obj instanceof Sample) {
			Sample s = (Sample)obj;
			return s.num == this.num;
		}
		return false;
	}
}

Test.java

public class Test {

	public static void main(String[] args) {
		Sample aaa = new Sample(10);
		Sample bbb = new Sample(10);
		System.out.println(aaa.isTestTest(bbb));
		
	}

}

結果

コンパイルエラーは起きなかったです。

同じクラスで、別インスタンスのprivate変数にアクセスができるらしい

Sample.javaの15行目付近の以下のコードで
private変数の「num」にアクセスしているからコンパイルエラーが発生すると思っていた。

Sample s = (Sample)obj;
return s.num == this.num;

ですが、コンパイルエラーが発生しなかったみたいです。
どうやら
「同一クラスであれば、private変数にアクセスすることが可能」
と言うものだったみたいです。

もう少し深堀

15行目で「Sampleクラス」をキャストして受け取っていますが、
「同じクラス内のisTestTestメソッド内」で受け取っているため
16行目でprivate変数にアクセスしてもコンパイルエラーが起きないみたいです。
※あまりこう言う使い方はしないかもですが、「同一の『値』を保持しているかどうか」をチェックする際は使うのかもですね・・・

理由

理由については、詳しく解説しているサイトを発見しましたので
ここにて紹介をさせていただこうと思います!

シンプルに砕けた言い方をすると
「this.numと書いているのと考え方は近い」
「thisはこの『クラス』と捉えて良い」
「private変数は同一の『クラス』内であればアクセスが可能」
と言う感じでしょうか。
改めて勉強になったので今回はご紹介をさせていただきました!

今回は以上!

スポンサーリンク