2013-12-12 38 views
1

嗨,我是Ankur,現在已經用java編碼了幾年了..我已經閱讀過Hermann Schildt的第一個Java完整參考文獻,前面和最近我遇到了Oracle docs這個頁面中的一個主要謬論。註釋部分說If構造函數不會顯式調用超類的構造函數,Java編譯器會自動插入對超類的無參構造函數的調用。如果超類沒有沒有參數的構造函數,那麼你會得到一個編譯時錯誤。對象確實有這樣的構造函數,所以如果Object是唯一的超類,那就沒有問題了。但是,如果我明確地沒有提到超類中的默認構造函數,我仍然沒有得到一個錯誤!我從來沒有在任何一本書中發現過這樣的信息!!事實上,我可以很容易地運行一個展示構造函數鏈的程序,而不提供默認超類的構造函數!下面是代碼:我不明白Oracle文檔中的這部分內容嗎?

import java.io.*; 
import java.util.*; 
class student 
{ 
// student() 
//{ 
    //System.out.println("I am student\n");  
// } 
public void subjects() 
{  
    System.out.println("English..");  
} 
} 
class engineering extends student 
{ 
engineering() 
{ 
    System.out.println("I am an engineer..\n");  
} 

public void subjects() 
{     
    System.out.println("Maths"); 
} 
} 
class computer extends engineering 
{ 
computer() 
{ 
    System.out.println("I am a computer engineer."); 
} 
public void subjects() 
{  
    System.out.println("Computer"); 
} 
} 
class test8 
{ 
public static void main(String args[]) 
{ 
    computer cs=new computer();  
} 
} 

在上面的代碼,如果我與代碼的註釋塊運行它,構造鏈發生normally.First學生()構造運行,則工程(),然後計算機() ..但是,當我刪除基類student()的默認構造函數,它仍然運行成功..不是在Oracle文檔中的參數,在構造函數鏈中必須提供超類中的默認構造函數錯誤或是我的理解在oracle文檔中的這個部分是錯誤的?請幫助我解決這個問題! 謝謝!

+2

請正確縮進並使用Java命名約定,類名以大寫字母開頭。 –

+0

你會在這個[SO帖子]中得到答案(http://stackoverflow.com/a/14250503/2982225) –

回答

2

編譯器還將默認構造函數添加到任何未聲明任何類的類。如果你的超類聲明瞭除默認構造函數以外的另一個構造函數,並且如果你註釋掉了默認構造函數,那麼你將會得到編譯器錯誤。

+0

你的發佈速度比我快32秒。 =快速響應的D + 1。 –

+0

您好,Topolnik先生,我沒有收到編譯器錯誤,我的意思是文檔說如果沒有默認構造函數,我會得到一個錯誤! –

+0

有一個默認的構造函數。編譯會爲您提供。即使你從來沒有看到它,它在那裏。但是,如果您定義了其他構造函數,編譯器將不提供默認構造函數。我認爲這最後一點是文檔所指的。 – Alex

0

那麼在你的例子中,如果一個類Student沒有任何構造函數,那麼使用默認的no-param構造函數,因此代碼確實運行沒有問題。

0

編譯器自動生成參數構造函數,除非您定義了另一個構造函數。

因此,在你的情況與學生類,沒有參數構造函數被自動插入,因爲你沒有提供任何其他構造函數。

0

如果您沒有提供無參數構造函數,那麼編譯會爲您提供一個,只要沒有定義其他構造函數。所以在你的例子中,如果你註釋掉你的student()構造函數,編譯器會插入no-arg student()構造函數。