java扩展关键字是一个引用变量?

时间:2016-03-15 07:33:45

标签: java keyword

我知道在java中扩展关键字do是什么,但我想了解java编译器在看到extends关键字时会做什么。

class A{
//some state

//some behavior
}

class B extends A{

} 

在我看来,当编译器看到扩展关键字时,它会创建要在子类中使用的超类对象。我知道我们可以在子类构造函数中使用超级引用关键字来引用超类构造函数。

1 个答案:

答案 0 :(得分:3)

不,没有对超类对象的引用。当您执行new B()时,您的示例会创建一个对象,该对象具有AB个功能的组合,而不是单独的{{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.fieldA#sayField使用field而不是this.field B#sayField怎么办?答案是:在一个对象中有两个field个字段。编译器告诉A#sayField中的代码使用第一个代码,B#sayField中的代码使用第二个代码。