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

kg7wmglp  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(298)

在下面的代码中,超级关键字引用的是什么?

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);
    }
}

如果没有创建超级类的对象/示例,那么超级关键字引用的是什么,因为它是一个引用变量,应该引用超级类示例?

fafcakar

fafcakar1#

注意 super 有点不同于 this 因为 super 不是主表达式。事实上 super 这根本不是一个表达。所以这样说毫无意义 super 它本身指的是任何东西。请注意,您不能执行以下操作:

SomeType foo = super;

什么是有意义的,这些(不是一个详尽的清单,所有涉及的 super ):
表单的超类构造函数调用 super(...); 表单的字段访问 super.identifier 窗体的方法调用 super.identifier(...) 这些形式都是指不同的事物,但单词 super 它本身没有单一的含义,除非您对“与超类有关的东西”感到满意。
特别是在这个问题中,您询问的是字段访问。语言规范第15.11.2节对此进行了描述。
形式 super.Identifier 引用名为的字段 Identifier 当前对象的,但当前对象被视为当前类的超类的示例。
对于 i1 自从 B 继承自 A , i1 将引用同一字段,即使您将当前对象视为 B ,因此,将当前对象视为哪个类并不重要。不管是 super.i1this.i1 ,或只是 i1 ,没什么区别。重新申报时,差异更为明显 i1 在里面 B :

class A { 
    int i1 = 10;
}
class B extends A { 
    int i1 = 20; 
    int i2 = super.i1;
}
``` `i2` 将得到值10,而不是 `20` ,因为您将当前对象视为 `A` . 请注意,在本例中 `B` 获取两个名为 `i1` 继承自 `A` ,并于 `B` . 将“对象”视为 `A` “将让您看到从 `A` ,否则它是隐藏的。
lzfw57am

lzfw57am2#

int i2 = super.i1; and int i2 = i1; both are same

当i1像wise一样从父类a继承到子类b时

int i3 = super.i2;  and int i3 = i2; both are same

super仅指父类。创建类c的对象时,会创建一个对象—c的示例。
另外,c同时是b的示例和a的示例,也是对象,因为c同时是b的示例和a的示例,所以在构造函数中添加了一个cal super()来调用父类c的构造函数调用b的构造函数,b的构造函数调用a的构造函数

相关问题