根据我的理解,当我们将子对象转换为父类的引用时,子对象将丢失与子类相关的特定属性。但是,它仍然可以识别重写的方法和变量。
我的问题是为什么输出显示来自子类的结果,如果是over ridden方法,则结果来自父类,如果是重写的变量。为什么方法和变量之间的行为存在差异
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
}
}
答案 0 :(得分:1)
因为你的理解是错误的。 Java对象的行为与真实对象非常相似。仅仅因为你将孩子称为人类并不会改变孩子如何移动,哭泣和玩耍。它仍然是一个孩子。
这就是多态性的全部要点:你可以在不知道具体类型的情况下引用一个对象,它的行为与其具体的类型定义一样。
请注意,多态和覆盖仅适用于方法,而不适用于字段。字段永远不会以多态方式解析。它们不应该直接从外部访问:始终通过方法。这是OO的另一个主要原则:封装。
在B中,你没有覆盖字段a,而是引入另一个具有相同名称的字段,该字段隐藏了A中定义的字段。
答案 1 :(得分:0)
覆盖适用于方法,而不是字段。在子类hides中具有相同字段的超类字段。
由于obj
的类型为A
,因此a
中初始化的实际值A
会被打印