14

クラス内で、スーパークラスのフィールドと同じ名前を持つフィールドは、スーパークラスのフィールドを隠します。

public class Test {

    public static void main(String[] args) {

        Father father = new Son();
        System.out.println(father.i); //why 1?
        System.out.println(father.getI());  //2
        System.out.println(father.j);  //why 10?
        System.out.println(father.getJ()); //why 10?

        System.out.println();

        Son son = new Son();
        System.out.println(son.i);  //2 
        System.out.println(son.getI()); //2
        System.out.println(son.j); //20
        System.out.println(son.getJ()); //why 10?
    }  
}

class Son extends Father {

    int i = 2;
    int j = 20;

    @Override
    public int getI() {
        return i;
    }
}

class Father {

    int i = 1;
    int j = 10;

    public int getI() {
        return i;
    }

    public int getJ() {
        return j;
    }
}

誰かが私のために結果を説明できますか?

4

2 に答える 2

13

Java では、フィールドは多態的ではありません。

Father father = new Son();
System.out.println(father.i); //why 1? Ans : reference is of type father, so 1 (fields are not polymorphic)
System.out.println(father.getI());  //2 : overridden method called
System.out.println(father.j);  //why 10? Ans : reference is of type father, so 2
System.out.println(father.getJ()); //why 10? there is not overridden getJ() method in Son class, so father.getJ() is called

System.out.println();

// same explaination as above for following 
Son son = new Son();
System.out.println(son.i);  //2 
System.out.println(son.getI()); //2
System.out.println(son.j); //20
System.out.println(son.getJ()); //why 10?
于 2012-09-03T09:07:12.330 に答える
4

メソッドのオーバーライドと非表示に従って

呼び出される隠しメソッドのバージョンは、それがスーパークラスから呼び出されるかサブクラスから呼び出されるかによって異なります。

つまり、スーパー クラス参照を介してサブクラスでオーバーライドされるメソッドを呼び出すと、スーパー クラス メソッドが呼び出され、スーパー クラス メンバーにアクセスします。

これは、使用される参照がスーパークラスであるため、次のように説明します。

System.out.println(father.i);  //why 1?
System.out.println(father.j);  //why 10?
System.out.println(father.getJ()); //why 10?

以下についても同様です。

System.out.println(son.getJ()); //why 10?

はバージョンで定義されてgetJ()いないため、クラスで定義されたメンバーを参照して呼び出されます。SonFatherFather

非表示フィールドを読んだ場合; 彼らは特に次のようなコーディング方法を推奨していません

一般的に、フィールドを非表示にするとコードが読みにくくなるため、非表示にすることはお勧めしません。

于 2012-09-03T09:15:24.373 に答える