2014-09-28 131 views
3

我看到这个程序在java书中有测试,我无法理解,为什么这是正确的答案:Java测试(初学者)

该程序的输出是什么?

class Base 
{ 
    Base() 
    { 
     System.out.print("Base"); 
    } 
} 
public class Alpha extends Base 
{ 
    public static void main(String[] args) 
    { 
     new Alpha(); /* Line 12 */ 
     new Base(); /* Line 13 */ 
    } 
} 

所有答案:

  • A.Base
  • B.BaseBase
  • C.Compilation失败
  • D.The代码没有 输出

运行正确答案是BaseBase

+1

[相关](http://stackoverflow.com/questions/10508107/why-call-super-in-a-constructor) – Scis 2014-09-28 10:28:49

回答

9

当您第一次拨打new Alpha()时,您会调用Alpha的默认构造函数。因为它没有明确地宣布,它隐含定义为:

public Alpha() { 
    super(); 
} 

因此,new Alpha()调用的Base默认构造函数(becauses AlphaBase一个子类),它打印“基地”。然后,new Base()也调用该构造函数并再次打印“Base”,导致“BaseBase”的最终输出。

3

这将是答案B.BaseBase。 原因很简单。所有对象在实例化时调用该类的默认构造函数。 尽管Alpha类中没有构造函数,但是java隐式地提供了一个构造函数,并通过它调用其基类(即Base())的默认构造函数。

它像一个隐含的超()关键字是在每一个默认构造

当你调用新基地()
public Alpha() { 
    super(); 
} 

而且同样的方式开始时加入;显示了它的构造函数中的相应输出。