2014-02-28 220 views
-1

當我嘗試創建B類型對象時,下面的代碼給出錯誤。我的問題是爲什麼不是A的默認構造函數被調用?通過子類構造函數隱式調用默認構造函數

class A 
{ 
    private int a; 

    A(int a) 
    { 
    this.a = a; 
    System.out.println("This is constructor of class A"); 
    } 
} 

class B extends A 
{ 
    private int b; 
    private double c; 

    B(int b, double c) 
    { 
    this.b = b; 
    this.c = c; 
    System.out.println("This is constructor of class B"); 
    } 
} 
+0

這是基本的基本Java 101,在這裏發佈之前,您應該努力學習使用教程和其他資源。請閱讀[FAQ]和[Ask]瞭解StackOverflow的用途和範圍。提示:它的目的是作爲解決實際問題的長期資源,而不是獲得基本的教程指導。關於SO的問題和答案旨在對未來的搜索者有用,因此複製這種類型的信息幾乎沒有長期價值。 –

回答

2

我的問題是,爲什麼沒有一個默認的構造器叫什麼名字?

因爲沒有一個。當你提供你自己的參數化構造函數時,編譯器不會添加默認的構造函數。所以,你似乎在想的類A有一個0-arg構造函數,沒有。你必須明確添加一個。

+0

你能解釋爲什麼我寫'B b1 = new B(10,8.6);' ?是因爲編譯器試圖找到'A()'構造函數,但超類中沒有任何構造函數。 –

+0

@SalmanAnjum是的。 –

0

A的默認構造函數意味着新的A()。您沒有可用的構造函數,這意味着構造A的唯一方法是調用新的A(int)。由於沒有默認構造函數B必須顯式調用A的超級構造函數來正確初始化A.

0

因爲只有在Java中沒有構造函數時調用默認構造函數。

0

當您定義自己的構造函數時,java編譯器不再自動插入默認構造函數。

在你的代碼中,當構造B時,第一行隱式調用超類構造器。​​儘管由於您已經重寫了A的默認構造方法,因此編譯器不會自動使用必要參數自動調用超類構造函數,所以不存在構造函數調用。您應該在B構造函數的第一行添加一行,以便使用它需要的int參數調用A的超類構造函數,或者爲A定義構造函數,類似於不帶參數的默認構造函數。

您可以重載構造函數,以便一個構造函數像默認構造函數一樣是無參數的,然後有其他構造函數接受參數。 :d

這方面的一個例子如下,根據您的代碼:

class A 
{ 
private int a; 

A(int a) 
{ 
    this.a =a; 
    System.out.println("This is constructor of class A"); 
} 

//overload constructor with parameterless constructor similar to default 
A() { 
    System.out.println("this is like a default no-args constructor"); 
} 
} // end class A 

class B extends A 
{ 
private int b; 
private double c; 

    // add in another constructor for B that callers can use 
    B() { 
     int b = 9; 
     System.out.println("new B made in parameterless constructor"); 

    } 

    B(int b,double c) 
    { 
    super(b); // this calls class A's constructor that takes an int argument :D 
    this.b=b; 
    this.c=c; 
     System.out.println("This is constructor of class B"); 
    } 
} // end class B 
0

嘗試在擴展類的構造函數添加引用父類的構造函數即

class B extends A 
{ 
private int b; 
private double c; 
B(int b,double c, int superVal) 
{ 
super(superVal); 
this.b=b; 
this.c=c; 
System.out.println("This is constructor of class B"); 
} 
} 
0

默認構造函數是一個不包含任何參數的構造函數。如果沒有這樣的默認構造函數,編譯器會創建一個構造函數,前提是沒有其他可用的參數化構造函數。

在這個例子中,因爲有一個可用的參數化構造函數,所以編譯器不會創建一個默認構造函數。由於沒有可用的默認/無參數構造函數,所以會導致編譯錯誤