Java継承はメンバー変数とメソッドの処理に違いがあります


次のコードの出力結果を考えてください.
public class Base {
	int count = 2;
	
	public void display() {
		System.out.println(this.count);
	}
}
public class Derived extends Base {
	int count = 20;

	@Override
	public void display() {
		System.out.println(this.count);
	}
	
	public static void main(String[] args) {
		Base b = new Base();                    // 
		b.display();
		System.out.println(b.count + "
"); Derived d = new Derived();            // d.display(); System.out.println(d.count + "
"); Base bd = new Derived();                // bd.display(); System.out.println(bd.count + "
"); Base b2d = d;                        // d.display(); System.out.println(b2d.count + "
"); } }

プログラムはコンソールで次のように出力されます.
2
2
20
20
20
2
20
2
多くの人が3組目、4組目の出力に疑問を感じていると信じていますが、実はJava教材の大まかな紹介の誤導です.
d変数であれ、bd変数であれ、b 2 d変数であれ、それらを宣言するときにどのようなタイプを使用するかにかかわらず、実際にDerviedオブジェクトを指す限り、変数を参照してメソッドを呼び出すと、メソッドの動作は常に実際のオブジェクトタイプの動作を示します.ただし、これらの参照変数によってオブジェクトを指すインスタンス変数にアクセスすると、これらのインスタンス変数の値は常に、これらの変数が使用するタイプを宣言する動作を示します.このように,Java継承はメンバ変数とメソッドを処理する際に異なる.