2012-08-22 118 views
26

Javadoc提到Object類有一個公共的無參數構造函數。但是Object的源代碼中沒有任何顯式的構造函數。顯然,編譯器爲它生成了一個。但是,如果在構造函數即將返回時看到調用堆棧跟蹤(如下所示),則在該跟蹤中看不到任何對Object.<init>的調用。Java:Object類有一個構造函數嗎?

所以問題是,是否Object類有一個默認的構造函數作爲文檔說的?如果是,爲什麼我沒有在調用堆棧跟蹤中看到它?

public ConTest() 
{ 
    new Throwable().printStackTrace(); 
} 

結果:

java.lang.Throwable 
    at ConTest.<init>(ConTest.java:8) 
    at ConTest.main(ConTest.java:16) 
+1

從http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html 嗯所有的類至少有一個構造函數。如果一個類不顯式聲明任何類,則Java編譯器會自動提供一個名爲默認構造函數的無參構造函數 。如果該類沒有其他父級,則此默認對象構造函數。 – MimiEAM

+1

是否可以接受多個答案?因爲我想接受下面給出的全部4個答案。 – shrini1000

回答

24

超級構造函數之前子/基礎構造運行。在您的示例中,執行new Throwable().printStackTrace()時,Object的構造函數已經運行。

一個代碼的更明確的版本:

public ConTest() 
{ 
    super(); 
    new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace. 
} 
6

你沒有看到它的堆棧跟蹤,因爲它已經被調用。在您的代碼中拋出異常。

您的代碼就相當於寫:

public ConTest() { 
    super(); // this will call the Object constructor 
    new Throwable().printStackTrace(); 
} 
6

你沒有看到它的堆棧跟蹤,因爲父類的構造函數是您new Throwable().printStackTace()調用之前調用。編譯器實際創建的內容如下。

public ConTest() 
{ 
    super(); // This is the call to the base class constructor 
    new Throwable().printStackTrace(); // already back from the base class constructor 
} 
2

所建議的上述超()是在構造函數和方法的詳細信息,第一次調用here

當你編譯一個類,Java編譯器會爲每個構造函數實例初始化方法你在類的源代碼中聲明。儘管構造函數不是方法,但實例初始化方法是。它有一個名字,<init>,返回類型,無效的,和一組匹配從中產生

5

是的,Object類有一個默認的構造函數的醫生說的構造函數的參數的參數。

如你所知insted的做,你可以通過在命令提示符下使用的javap -c大賽檢查 你可以看到它調用了對象類的默認構造函數()在下面的代碼的號線:1

C:\stackdemo>javap -c ConTest 
Compiled from "ConTest.java" 
public class ConTest extends java.lang.Object{ 
public ConTest(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: new  #2; //class java/lang/Throwable 
    7: dup 
    8: invokespecial #3; //Method java/lang/Throwable."<init>":()V 
    11: invokevirtual #4; //Method java/lang/Throwable.printStackTrace:()V 
    14: return 

public static void main(java.lang.String[]); 
    Code: 
    0: new  #5; //class ConTest 
    3: dup 
    4: invokespecial #6; //Method "<init>":()V 
    7: astore_1 
    8: return 

} 

謝謝

相關問題