如果在继承过程中只创建了一个对象,那么超级关键字引用的是什么



在下面的代码中,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的构造函数

请注意,superthis有点不同,因为super不是主表达式。事实上,super根本不是一个表达式。因此,说super本身指的是任何东西都没有什么意义。注意,你不能做:

SomeType foo = super;

有什么意义,这些(不是涉及super的所有内容的详尽列表(:

  • 形式为super(...);的超类构造函数调用
  • 表单super.identifier的字段访问
  • 形式为super.identifier(...)的方法调用

这些形式都指不同的事物,但super这个词本身没有单一的含义,除非你对"与超类有关";。

特别是在这个问题中,您询问的是字段访问。语言规范第15.11.2节对此进行了说明。

形式super.Identifier引用当前对象的名为Identifier的字段,但当前对象被视为当前类的超类的实例。

对于i1,由于B继承自A,即使将当前对象视为Bi1也会引用同一字段,因此将当前对象查看为哪个类并不重要。无论是super.i1this.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继承的,否则它将被隐藏。

最新更新