Java中字段是如何工作的?
我在阅读有关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;
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的解释。但是,对我来说,他列出的原因应该没什么问题。不清楚。返回的值取决于引用的形式类型。不是它的实际类型。