2012-03-10 72 views
1

我有以下两类:二OO问题,章构造

public class Animal { 
    public Animal() { 
     this("Animal->Horse"); 
     System.out.println("Class Animal default const"); 
    } 

    public Animal(String name) { 
     this.name = name; 
     System.out.println(this.name); 
    } 
    String name; 
} 

public class Pegasus extends Animal { 
     public Pegasus() { 
     System.out.println("Class Pegasus default const"); 
    } 

    public static void main(String[] args) 
    { 
     Animal animal = new Animal("Black Horse"); 
     animal.name = "Pegasus"; 
     Pegasus pegasus = new Pegasus(); 
     pegasus.name = "White Horse"; 
    } 
} 

当我执行此我得到:

Black Horse 
Animal->Horse 
Class Animal default const 
Class Pegasus default const 

Q1:为什么Animal->Horse得到印刷一次当animal实例是否创建了pegasus实例?本质上它是从默认的构造函数中调用的。另外为什么不animal实例打印Class Animal default const

Q2:当我创建了pegasus情况下,有没有办法为它不叫class Animal的默认构造函数并调用class Pegasus默认构造函数?

+1

为什么要在动物构造函数中打印出“Animal-> Horse”?这意味着你正在创造一匹马作为默认动物,这可能是也可能不是这个意图。无论如何,名为“动物”的类应该是抽象的,因为当有人问你“什么是动物?”时你可以(可能会)用“它取决于它是什么样的动物”来回答它。 – 2012-04-22 19:35:32

+0

@ArnabDatta:谢谢:)但这只是打印一些东西。但我明白这一点。 – noMAD 2012-04-22 23:38:19

回答

7

问题1:动物实例创建时为什么Animal-> Horse只打印一次而不是创建Pegasus实例?

这是倒过来 - 这是当你调用Animal(String)构造与new Animal("Black Horse")正在打印,但它当你调用Pegasus()构造函数,再调用Animal()构造正在打印这又调用Animal(String)构造函数。

我强烈建议你在的new Animal("Black Horse")构造函数调用后加上一行额外的诊断文本。这将帮助你更清楚地看到发生了什么。

Q2:当我创建了飞马情况下,是有它不调用类动物的默认构造函数

那么它可以调用Animal(String)构造例如一种方式与

super("Pegasus"); 

,但它必须调用Animal一些构造。在创建类的实例时,必须通过每个类中的至少一个构造函数初始化其继承层次中的类。

+0

+1,打我吧。 – Jeffrey 2012-03-10 21:58:28

+0

啊,我明白了。但是,如果超类没有任何构造函数的实现,那么派生类自己调用什么?它是默认的构造函数吗?但是目的是什么? – noMAD 2012-03-10 22:06:22

+0

对于没有明确定义一个类的每个类都定义了一个隐含的无参数构造函数。 – 2012-03-10 22:10:24

1

Q1:两个构造函数都有“相等的计费”,所以不需要1-arg方法来调用无参数构造函数。所以唯一被调用的ctor就是1-arg,它给你输出的第一行。

Q2:你飞马是动物的一个实例,因此,才可以开始初始化飞马部分,它必须首先初始化动物部分。要做到这一点,它需要选择一个动物构造函数。既然你没有明确地调用它,它会选择“默认”版本,即没有参数。无arg-one首先调用one-arg one,并为您提供第二行输出。然后,没有arg的继续你的第三条输出线。最后,你的Pegasus ctor现在可以被调用,导致你的第四行。