This question already has answers here:
Is there a way to override class variables in Java?

(17个答案)



Overriding member variables in Java ( Variable Hiding)

(12个答案)


3年前关闭。




我无法理解以下输出。

我不知道为什么输出是10,我认为A a = new B()行创建了B类的新实例,我认为结果应该是20
class A {
    int i = 10;
}

class B extends A {
    int i = 20;
}

public class MainClass {
    public static void main(String[] args) {
        A a = new B();

        System.out.println(a.i);
    }
}

为什么这样工作..请解释。

最佳答案

首先,请参见Hiding Fields(添加了重点)



换句话说,这不是“继承”,因为您实际上是将Ai隐藏在Bi之后,并且您正在使用A的引用对象,因此可以获取其字段。如果您执行了B b = new B(),则会按预期看到20

如果期望真正的替代,请尝试使用方法。

class A {
    public int get() {
        return 10;
    }
}

class B extends A {
    @Override
    public int get() {
        return 20;
    }
}

看到
A a = new B();
System.out.print(a.get()); // 20

如果您真的想一次看到两者,请参见以下示例。
class A {
    int i = 10;
}

class B extends A {
    int i = 20;

    @Override
    public String toString() {
        return String.format("super: %d; this: %d", super.i, this.i);
    }
}


A a = new B();
System.out.print(a); // super: 10; this: 20

09-25 20:21