在下面的代码中,super关键字引用的是什么?
class A {
int i1 = 10;
A() {
System.out.println("class A");
}
}
class B extends A {
int i2 = super.i1;
B() {
System.out.println("class B");
}
}
class C extends B {
int i3 = super.i2;
public static void main(String args[]) {
C c = new C();
System.out.println(c.i3);
}
}
如果没有创建超级类的对象/实例,那么超级关键字引用什么,因为它是一个引用变量,应该引用超级类实例?
int i2 = super.i1; and int i2 = i1; both are same
因为i1从父类A继承到子类B像明智的
int i3 = super.i2; and int i3 = i2; both are same
Super仅指父类。当您创建C类的对象时,将创建一个对象-C.的实例
C是B的实例,同时也是A的实例,也是Object由于C同时是B的实例和A的实例,这就是为什么在构造函数中添加cal super((来调用父类的构造函数。C的构造函数调用B的构造函数,B的构造函数调用A的构造函数
请注意,super
与this
有点不同,因为super
不是主表达式。事实上,super
根本不是一个表达式。因此,说super
本身指的是任何东西都没有什么意义。注意,你不能做:
SomeType foo = super;
有什么意义,这些(不是涉及super
的所有内容的详尽列表(:
- 形式为
super(...);
的超类构造函数调用 - 表单
super.identifier
的字段访问 - 形式为
super.identifier(...)
的方法调用
这些形式都指不同的事物,但super
这个词本身没有单一的含义,除非你对"与超类有关";。
特别是在这个问题中,您询问的是字段访问。语言规范第15.11.2节对此进行了说明。
形式
super.Identifier
引用当前对象的名为Identifier
的字段,但当前对象被视为当前类的超类的实例。
对于i1
,由于B
继承自A
,即使将当前对象视为B
,i1
也会引用同一字段,因此将当前对象查看为哪个类并不重要。无论是super.i1
、this.i1
还是仅i1
,都没有区别。当您在B
:中重新声明i1
时,差异更明显
class A {
int i1 = 10;
}
class B extends A {
int i1 = 20;
int i2 = super.i1;
}
i2
将获得值10,而不是20
,因为您将当前对象视为A
。注意,在这种情况下,B
的实例得到两个名为i1
的字段,一个从A
继承,另一个在B
中声明。查看对象";作为CCD_ 30〃;会让您看到从A
继承的,否则它将被隐藏。