2016-03-15 35 views
1

我知道在java中扩展关键字do,但是我想了解java编译器在看到extends keyword时做了什么。是java扩展关键字的一个引用变量吗?

class A{ 
//some state 

//some behavior 
} 

class B extends A{ 

} 
在编译时看到我看来

extends关键字,然后它会在子类中使用超类对象。我知道我们可以在子类构造函数中使用超级引用关键字来引用超类构造函数。

回答

3

不,没有对超类对象的引用。当你做new B(),你的例子中,有一个对象创建,它具有AB功能的组合,而不是单独的BA对象与它们之间的关系。 (这将是原型继承,它用于几种语言,但不是Java)。

super不是对单独对象的引用。从JLS§15.11.2

形式super.Identifier是指命名的当前对象的标识符领域,但视为当前类的超类的一个实例的当前对象。

有时候,好像有必须是两个不同的对象,当你的影子实例字段,如:

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

如果你这样做:

B b = new B(1, 2); 
b.sayField(); 

..你得到(live copy

 
(A) field == 1 
(B) field == 2 

如果只是一个对象,它怎么能是this.fieldA#sayField使用不同的fieldthis.fieldB#sayField?答案是:在一个对象中有两个field字段。编译器通知A#sayField中的代码使用第一个,并且B#sayField中的代码使用第二个。

+0

是扩展关键字参考变量吗? –

+0

我的主要conense是扩展关键字。它是如何工作的 ? –

+0

@RidaBatool:不,再次,没有单独的对象可供参考。我已经扩展了一些答案,试图使这一点更清楚。 –