在下面的代码中,超级关键字引用的是什么?
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);
}
}
如果没有创建超级类的对象/示例,那么超级关键字引用的是什么,因为它是一个引用变量,应该引用超级类示例?
2条答案
按热度按时间fafcakar1#
注意
super
有点不同于this
因为super
不是主表达式。事实上super
这根本不是一个表达。所以这样说毫无意义super
它本身指的是任何东西。请注意,您不能执行以下操作:什么是有意义的,这些(不是一个详尽的清单,所有涉及的
super
):表单的超类构造函数调用
super(...);
表单的字段访问super.identifier
窗体的方法调用super.identifier(...)
这些形式都是指不同的事物,但单词super
它本身没有单一的含义,除非您对“与超类有关的东西”感到满意。特别是在这个问题中,您询问的是字段访问。语言规范第15.11.2节对此进行了描述。
形式
super.Identifier
引用名为的字段Identifier
当前对象的,但当前对象被视为当前类的超类的示例。对于
i1
自从B
继承自A
,i1
将引用同一字段,即使您将当前对象视为B
,因此,将当前对象视为哪个类并不重要。不管是super.i1
或this.i1
,或只是i1
,没什么区别。重新申报时,差异更为明显i1
在里面B
:lzfw57am2#
当i1像wise一样从父类a继承到子类b时
super仅指父类。创建类c的对象时,会创建一个对象—c的示例。
另外,c同时是b的示例和a的示例,也是对象,因为c同时是b的示例和a的示例,所以在构造函数中添加了一个cal super()来调用父类c的构造函数调用b的构造函数,b的构造函数调用a的构造函数