访问子类的重写变量和方法时的差异

时间:2013-07-19 13:03:02

标签: java inheritance

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

我的问题是为什么输出显示来自子类的结果,如果是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
    }
}

2 个答案:

答案 0 :(得分:1)

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

这就是多态性的全部要点:你可以在不知道具体类型的情况下引用一个对象,它的行为与其具体的类型定义一样。

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

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

答案 1 :(得分:0)

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

由于obj的类型为A,因此a中初始化的实际值A会被打印

相关问题