2011-10-15 40 views
0

家伙能否请您给我解释一下怎么来的这个例子的输出是:解释这个继承Java程序的输出?

Exam1 
    This is Tennis Shoes 
    derived class 
    This is a white Tennis Shoes is created 

如果你能到我,我们创造了White Tennis Shoes对象发生了什么之后到底发生了什么解释。 请大家不要告诉我做你的功课,或者我只是准备考试,而这是一个老问题。

的代码如下:

class Shoes{ 
    public Shoes(){ 
     this("you have created a shoes Object"); 
     System.out.println("This is the base class"); 
    } 

    public Shoes(String s){ 
     System.out.println(s); 
    } 
} 

class TennisShoes extends Shoes{ 
    public TennisShoes(){ 
     this("This is Tennis Shoes"); 
     System.out.println("derived class"); 
    } 

    public TennisShoes(String s){ 
     super("Exam1"); 
     System.out.println(s); 
    } 
} 

class WhiteTennisShoes extends TennisShoes{ 
    public WhiteTennisShoes(String s){ 
     System.out.println(s); 
    } 
} 

class ConstructorPrintingTester{ 
    public static void main(String[] args){ 
     WhiteTennisShoes shoesObj; 
     shoesObj = new WhiteTennisShoes("This is a white Tennis Shoes is created"); 
    } 
} 
+3

无论作业与否,为什么不先解释发生了什么? –

+0

我不知道当你调用this(“xxxx”)时,它会调用当前构造函数中的另一个构造函数,这就是为什么它在思考15分钟后阻止了我!感谢phihag现在非常清楚,我喜欢他列举他们的方式,这是非常有用的。 –

+0

我也完全忘记了当你调用super()构造函数时,Java将为我创建一个。所以这就是为什么我真的无法从输出中理解一件事。 –

回答

3

当您创建WhiteTennisShoes类型的对象,它的构造函数执行:

public WhiteTennisShoes(String s){ 
    super(); // This line is automatically inserted 
    System.out.println(s); 
} 

由于每个构造函数必须调用超或在第一线的另一个构造函数,这样使得Java自动调用paremeter-不是超级构造函数,那么调用具有arity 0的TennisShoes构造函数。当前的调用堆栈然后

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 

现在,TenniesShoes()不会调用在第一线的另一个构造函数。当前调用堆栈现在

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 

即构造函数调用的说法"Exam1"单参数的构造函数超。调用堆栈是

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 
Shoes("Exam1") 

由于Shoes的一个参数的构造函数不调用构造函数,超类对象是现在所谓的隐性之一;调用堆栈是

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 
Shoes("Exam1") 
Object() 

之后,调用堆栈是解开所有的版画被称为依次是:

  1. Shoes("Exam1")打印"Exam1"
  2. TenniesShoes("This is Tennis Shoes")打印"This is Tennis Shoes"
  3. TenniesShoes()打印"derived class"
  4. WhiteTennisShoes("This is a white ...")打印"This is a white ..."
  5. main无法打印并退出。
+0

非常感谢你!我试图从你的步骤中了解。但是由于我不使用它,这使我很困惑。 '这(“这是网球鞋”);'这是什么意思? –

+0

哦,哦,我现在阅读你的步骤后,意味着什么。男人你是如此的有帮助!让我继续。当我在考试中遇到这样的问题时,我认为对我来说更好。 –

+0

2我不知道的东西/ awareOF 1-Java为我创建一个'Super()',如果我没有创建一个2-在调用构造函数的构造函数内,因为我从来没有尝试过。但现在很明显。非常感激 。 –

0

当你没有指定父类的构造在Java中的类来调用,默认的父类的构造被实例化时调用。在你的情况下,创建一个新的WhiteTennisShoes将自动调用默认的父构造函数,即TennisShoes()。这将调用TennisShoes(),然后调用Shoes(String)

在这种情况下要记住的重要一点是,在Java中,实例化一个类将调用该类和每个父类的构造函数。您可以指定要调用的父构造函数,如果不指定,则调用默认的no-arg父构造函数。

0

您调用WhiteTennisShoes构造函数。这个构造函数没有super()调用,所以编译器会为你插入一个,因此它的第一件事就是调用它的超类的无参数构造函数:TennisShoes。

没有任何参数的TennisShoes构造函数调用“This is Tennis Shoes”作为参数的其他构造函数。这个构造函数的第一个作用是以“Exam1”作为参数来调用它的超类的构造函数。

Shoes构造函数因此被调用Exam1作为参数,并输出Exam1。然后TennisShoes构造函数继续执行并输出它的参数:“这是网球鞋”。然后TennisShoes无参数构造函数继续执行并输出“派生类”。然后WhiteTennisShoes的构造函数继续执行并输出它的参数:“这是一个白色的网球鞋被创建”。