根据我的理解,当我们将子对象向上转换为父类的引用时,子对象会丢失与子类相关的特定属性。但是,它仍然可以识别重写的方法和变量。
我的问题是,为什么输出在覆盖方法的情况下显示子类的结果,在覆盖变量的情况下显示父类的结果。为什么方法和变量之间的行为存在如此差异
class A
{
int a = 2;
public void show()
{
System.out.println("Inside A");
}
}
class B extends A
{
int a = 555;
void show()
{
System.out.println("Inside B");
}
}
class Demo
{
public static void main(String[] args)
{
A obj = new B();
System.out.println(obj.a); // prints 2.
obj.show(); // prints Inside B
}
}
最佳答案
因为你的理解是错误的。 Java 对象的行为与真实对象非常相似。仅仅因为你将 child 称为人类,并不会改变 child 的移动、哭泣和玩耍方式。它还是个 child 。
这就是多态性的全部要点:您可以在不知道对象的具体类型的情况下引用该对象,并且它的行为将按照其具体类型定义中的定义进行。
请注意,多态性和覆盖仅适用于方法,而不适用于字段。字段永远不会以多态方式解析。无论如何,不应该从外部直接访问它们:始终通过方法。这是面向对象的另一个主要原则:封装。
在 B 中,您不会覆盖字段 a,而是引入另一个同名字段,该字段隐藏了 A 中定义的字段。
关于java - 访问子类中的重写变量和方法时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17746777/