Java中字段是如何工作的?

Java中字段是如何工作的?,java,polymorphism,Java,Polymorphism,我在阅读有关java的文章时,发现了一个很好的例子,感到困惑。因为没有更好/更多的解释可以帮助我理解这个例子。这是一个例子 public class MainClass { public static void main(String[] args) { Parent p = new Child(); System.out.println(p.getObject().x); } } class Parent { int x = 10;

我在阅读有关java的文章时,发现了一个很好的例子,感到困惑。因为没有更好/更多的解释可以帮助我理解这个例子。这是一个例子

public class MainClass {
    public static void main(String[] args) {
      Parent p = new Child();
      System.out.println(p.getObject().x);
    }
}

class Parent {
    int x = 10;

    public Parent getObject() {
        System.out.println("Parent Object");
        return new Child();
    }
} 

class Child extends Parent {
    int x = 20;

    public Child getObject() {
        System.out.println("Child Object");
        return new Child();
    }
}
输出:

Child Object
10
但当我将父类的getObject的返回类型更改为Child时

public Child getObject() {
        System.out.println("Parent Object");
        return new Child();
    }
然后我得到输出

Child Object
20
我知道多态性中不包括字段


在更改父对象getObject()的返回类型之后和之前,上面的示例中的结果应该是相同的,我感到困惑;方法。

您的
子类
有两个
x
成员,一个是它直接声明的,另一个是它从
父类继承的。使用
Child
引用时,
Child
x
成员将隐藏从
Parent
继承的引用。当您使用
Parent
引用时,您会看到
Parent
x
成员


因此,当您将
getObject()
的返回类型从
Parent
更改为
Child
时,
p.getObject().x
返回不同
x
成员的值。经验法则是-类成员不会像方法一样被覆盖。返回的值取决于访问它所使用的引用。如果使用父引用进行访问,则将返回父类的属性,如果引用是子类,则返回子类的属性。

由于返回类型是child,因此getObject()方法是child,那么它如何调用父类的x字段?字段绑定将在编译时解析,因此编译器知道是读取
Parent.x
还是读取
Child.x
@LetDoit静态(编译时)返回类型是
Parent
(在进行更改之前)。动态(运行时)类型为
Child
。编译时类型决定了哪些成员可以被访问。为什么Java会让一个参数掩盖另一个参数。至少在编译时应该有一个警告。这里有Jon Skeet的解释。但是,对我来说,他列出的原因应该没什么问题。不清楚。返回的值取决于引用的形式类型。不是它的实际类型。