子类对象访问超类隐藏变量

时间:2015-05-23 05:52:31

标签: java inheritance

我有一个子类对象。我可以在不使用super关键字的情况下访问超类的隐藏变量。 ??实际上,我找到了一种技术..它的工作但我不明白它背后的概念原因。

class A {
    public int a = 5; 
    private int c = 6; 

    void superclass() {
        System.out.println("Super class" + " " + "value of a is " + a);
        System.out.println("Super class" + " " + "value of c is " + c);
    }
}

class B extends A {
   int b = 7;
   int a = 8; 

   void subclass() {
       System.out.println("Sub class" + " " + "value of b is " + b);
       System.out.println("Sub class" + " " + "value of a is " + a);
   }
}

class Demo {
    public static void main(String args[]) {
       A a1 = new A();
       B b1 = new B();

       b1.superclass();
   }
}

在上面的代码中,如果b1是类B的对象,我调用了一个名为superclass()的超类方法;现在输出为a=5。但我的论点是为什么不能a=8?隐藏a=5并访问它,我们必须使用super关键字。但是这里没有超级关键词,我得到了a=5。怎么可能呢?

2 个答案:

答案 0 :(得分:2)

不覆盖字段。

所以尽管B定义了int名为' a' A定义相同名称的同一int并不代表它们是同一个字段。

这里看到的是Encapsulation。通过受控方法访问字段(此处为superclass())。当您致电superclass时,它会查找字段a,该字段位于自己的类中。班级Aa中的字段B一无所知,甚至不知道它存在。

此处还有另一个SnackOverflow问题:If you override a field in a subclass of a class, the subclass has two fields with the same name(and different type)?

答案 1 :(得分:0)

在这种情况下,当您调用超类的方法时,无论它是哪个类extends,它都会打印class中的值。这是因为超类不知道扩展它的是哪个(或多少个类)。这是encapsulation的基本OOP原则。