我知道在java中扩展关键字do是什么,但我想了解java编译器在看到extends关键字时会做什么。
class A{
//some state
//some behavior
}
class B extends A{
}
在我看来,当编译器看到扩展关键字时,它会创建要在子类中使用的超类对象。我知道我们可以在子类构造函数中使用超级引用关键字来引用超类构造函数。
答案 0 :(得分:3)
不,没有对超类对象的引用。当您执行new B()
时,您的示例会创建一个对象,该对象具有A
和B
个功能的组合,而不是单独的{{1} }和B
对象之间有关系。 (这将是原型继承,它用于多种语言,但不是Java。)
A
不是对单独对象的引用。来自JLS§15.11.2:
表单
super
.Identifier 是指当前对象的名为 Identifier 的字段,但当前对象被视为超类的一个实例现在的班级。
有时,似乎必须是两个独立的对象,例如当您遮蔽实例字段时:
super
如果你这样做:
class A {
private int field;
A(int value) {
this.field = value;
}
public void sayField() {
System.out.println("(A) field == " + this.field);
}
}
class B extends A {
private int field;
B(int aValue, int bValue) {
super(aValue);
this.field = bValue;
}
@Override
public void sayField() {
super.sayField();
System.out.println("(B) field == " + this.field);
}
}
...你得到(live copy)
(A) field == 1 (B) field == 2
如果只有一个对象,B b = new B(1, 2);
b.sayField();
this.field
内A#sayField
使用field
而不是this.field
B#sayField
怎么办?答案是:在一个对象中有两个field
个字段。编译器告诉A#sayField
中的代码使用第一个代码,B#sayField
中的代码使用第二个代码。