我有一个子类对象。我可以在不使用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
。怎么可能呢?
答案 0 :(得分:2)
不覆盖字段。
所以尽管B
定义了int
名为' a' A
定义相同名称的同一int
并不代表它们是同一个字段。
这里看到的是Encapsulation。通过受控方法访问字段(此处为superclass()
)。当您致电superclass
时,它会查找字段a
,该字段位于自己的类中。班级A
对a
中的字段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原则。