Java继承中隐藏字段

问题描述 投票:0回答:2

在类中,与超类中的字段同名的字段会隐藏超类的字段。

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;
    }
}

有人可以帮我解释一下结果吗?

java inheritance polymorphism field member-hiding
2个回答
16
投票

在 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 explanation 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?

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()
未在
Son
中定义,因此会调用
Father
版本,该版本会看到在
Father
类中定义的成员。

如果您阅读了隐藏字段;他们特别不推荐这样的编码方法

一般来说,我们不建议隐藏字段,因为这会使代码难以阅读。

© www.soinside.com 2019 - 2024. All rights reserved.