2013-10-08 81 views
0

在Java中如何实现继承?例如,考虑一下:在Java中如何实现继承?

class A { 
    public void foo() { 
     System.out.print("A"); 
    } 
} 
class B extends A { 
    ... 
} 
class Test { 
    public static void main(String[] args) { 
     B test = new B(); 
     test.foo(); // how is foo() called? 
} 

线下,将编译器只转储A.foo()的定义为B类的身体吗?像

class B extends A { 
    ... 
    public void foo() { 
     System.out.print("A"); 
    } 
} 

或者是foo以某种方式在A类中查找并在那里调用?

+1

'B.foo()'不会首先编译,因为它不是一个静态方法。你的意思是'test.foo()'? (但不,编译器不会复制方法实现...) –

+0

B.foo();根本不编译。 –

+0

糟糕。我的意思是test.foo();检查更新的版本。 –

回答

2

方法体不会复制到未定义的子类的方法体中。相反,当你致电

B test = new B(); 
test.foo(); 

它会看起来低谷的层次结构,每次找不到实现时都会上升到一个水平。 首先它会检查B哪些没有实现。高于此水平的是A,因此它会使用那一个。

+1

至少在理论上。我希望虚拟机会为每种类型构建一次查找表,以使其更有效,但效果是一样的。 –

+0

我认为继承是通过使用设计模式链的责任来实现的,当编译器找到重定义时,它将方法的代码放在类中,当它没有找到重定义时,它会生成一个委托给基类的方法类相当于super.foo(); –

3

这也许能够帮助你,说明从书艾弗霍顿的Begining的Java 7

我在本章派生类扩展基类的开头说。这不只是行话 - 它 真的这样做。正如我多次说过的那样,继承关于派生类中基类的成员是 ,而不是基类的成员在派生类对象中存在。 子对象包含原始基类的所有成员,以及在派生类中定义的所有新成员 。如图6-3所示。

enter image description here