2011-05-19 118 views
1

为什么在调用默认构造函数时未调用默认构造函数(相同类),但父类的默认构造函数正在调用 - 为什么?默认构造函数未调用

class A{ 
    A(){ 
     System.out.println("A()"); 
    } 
} 

class B extends A{ 
    B(){ 
     System.out.println("B()"); 
    } 
} 

class C extends B{ 
    C(){ 
     System.out.println("C()"); 
    } 
    C(int i){ 
     System.out.println("<------>"+i); 
    } 
} 
public class sample { 
    public static void main(String[] args) { 
     C c = new C(8); 

    } 
} 

输出:

A() 
B() 
<------>8 
+3

从技术上讲,这不是默认构造函数。在Java中,如果源中没有构造函数,则会提供合成的默认构造函数。具有零参数的构造函数被称为* no-args *构造函数。这与C++的不同之处在于,在各种情况下默认调用默认构造函数。 (Java语言中唯一一个无参数构造函数将被隐式调用的情况是,子类构造函数不显式调用“this(...)”或“super(...)”。) – 2011-05-19 13:12:38

回答

4

这是Java的规则。如果你想要你的行为,你必须使用this()作为C(int)中的第一条指令。

4

如说这是之前的Java标准的行为,如果你想一些代码来一直呼吁建设一个对象,你可以使用基于类声明类“C”的初始

class A{ 
    { 
     System.out.println("A()"); 
    } 
    A(){ 

    } 
} 
4

,你被超载的构造,因此,当你创建一个新的“C”对象,并在整数关口用下面的代码:

C c = new C(8); 

要调用构造函数

C(int i){ 
    System.out.println("<------>"+i); 
} 

代替构造

C(){ 
    System.out.println("C()"); 
} 

因此它不会打印出 “C()”。重载构造函数/函数取决于传入参数的类型和数量。最重要的是,只有1个构造函数被调用,用于创建每个对象。