0

根据我的理解,当我们将子对象转换为父类的引用时,子对象会失去与子类有关的特定属性。但是,它仍然可以识别被覆盖的方法和变量。

我的问题是为什么在方法被覆盖的情况下输出显示子类的结果,而在变量被覆盖的情况下输出显示父类的结果。为什么方法和变量之间的行为差​​异如此之大

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
    }
}
4

2 回答 2

1

因为你的理解是错误的。Java 对象的行为与真实对象非常相似。仅仅因为您将孩子称为人类并不会改变孩子的移动、哭泣和玩耍方式。它仍然是一个孩子。

这就是多态性的全部意义所在:您可以在不知道具体类型的情况下引用一个对象,并且它的行为将按照具体类型定义中的定义进行。

请注意,多态和覆盖仅适用于方法,而不适用于字段。字段永远不会以多态方式解析。无论如何,它们不应该直接从外部访问:总是通过方法。这就是 OO 的另一个主要原则:封装。

在 B 中,您不是覆盖字段 a,而是引入另一个具有相同名称的字段,它隐藏了 A 中定义的字段。

于 2013-07-19T13:05:11.420 回答
0

覆盖适用于方法,而不是字段。在子类中具有相同的字段会隐藏超类字段。

由于objis的类型,因此会打印初始化A的实际值aA

于 2013-07-19T13:06:08.240 回答