2014-01-17 65 views
3

我發現像這樣的類:超級構造函數如果沒有超類?

public class Computer implements Serializable { 

     private static final long serialVersionUID = 1L;  

     //... 
     public Computer() { 
      super(); 
     } 
     //... 
} 

有人能解釋我是如何工作的?這個類沒有繼承任何超類,並且仍然可以有「super();」在構造函數中?

+3

你[繼承](http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)從Object類,它有一個無參數構造函數。 _「在沒有任何其他顯式超類的情況下,每個類都隱式地是Object的一個子類。「_ –

+1

請注意,不需要調用no-arg'super()';如果不指定它,它將由編譯器插入 – chrylis

+0

java.lang.Object是唯一沒有超類的類,並且它的構造函數不包含super()調用 –

回答

7

默認情況下,所有類都繼承java.lang.Object。所以,在你的類的隱藏代碼

public class Computer extends java.lang.Object implements Serializable { 

     private static final long serialVersionUID = 1L;  

     //... 
     public Computer() { 
      super(); //here Object's default constructor is called 
     } 
     //... 
} 

如果父類有默認構造函數(無參數)如果子類定義默認構造函數,則顯式調用父類的構造是沒有必要的。

Java那樣它含蓄,換句話說,爪哇把super()第一條語句孩子的構造

考慮這個例子

class Base { 

    public Base() { 
     System.out.println("base"); 
    } 
} 

class Derived extends Base { 

    public Derived() { 
     //super(); call is not necessary.. Java code puts it here by default 
     System.out.println("derived"); 
    } 
} 

所以,當你創建Derived d = new Derived();輸出..

base 
derived 
+0

啊,我知道這一點,但並沒有想象有人會調用「Object」的構造函數。這是否有一個原因? 感謝您的回答! :) – codepleb

+1

它僅僅是一種編碼風格..如果您看到Object類沒有定義構造函數 - 這相當於定義一個空體的默認構造函數..換句話說,在您的情況下調用'super()'會不產生任何東西 – sanbhat

4

當你不要extends任何類,那麼默認情況下,繼承類是Object,所以它調用Object類構造函數。

1

默認情況下,每個Java類都會隱式繼承java.lang.Object類。所以,super()將在您的情況下調用Object類構造函數!

2

在Java中,Object類位於Class層次結構的頂部。隱含地說,所有類都隱含地爲Object類型。在代碼中不需要顯式調用super()方法。但是,在將類轉換爲字節碼的過程中,編譯器會添加。所以,任何構造函數的第一行默認情況下都會默認調用super()。構造一個對象包括所有超類的默認構造函數的調用。但是,您也可以在您的class構造函數中調用super類的自定義參數構造函數

1

默認任何類即使我們不擴展任何超類,擴展java.lang.Object類。所以它叫Object構造函數。

通過繼承的概念,我們可以正確編譯下面的代碼。

Object obj = new Computer(); 

即使,事實上,你interface參考可以被分配到java.lang.Object參考。

interface ICommand 
{ 

} 
class Computer implements ICommand 
{ 

} 
class Test 
{ 
    public static void main(String[] arg) 
    { 
     ICommand ic = new Computer(); 
     Object obj = ic; // 'ic' is an interface reference 
    } 
} 

通過這種方式,java.lang.Object也超接口(這是不準確的技術術語)的所有接口。