2012-06-19 272 views
2

由於我是新來的Java,我想知道, 1.多少默認構造函數定義爲當我做一個空類? 2.我是否需要定義複製構造函數,或者它是用C++自動定義的?默認Java構造

+2

每個問題請提出一個問題。 –

回答

7

只有一個默認的構造函數,當你聲明一個類沒有構造函數只被定義。否則,聲明的構造函數將是唯一的構造函數。如果不包括構造函數,編譯器插入代碼相當於

public ClassName() { 
    super(); 
} 

此外,如果你做了一類聲明構造函數,而你並沒有明確定義的超類的構造函數調用,編譯器將插入一個匹配超級類的調用參數。

public ClassName extends SuperClassName { 

    public ClassName(String item, List stuff) { 
    // no explicit super class constructor called 
    ... 
    } 

} 

在編譯器中被轉化爲類似

public ClassName extends SuperClassName { 

    public ClassName(String item, List stuff) { 
    // explicit super class constructor call to SuperClassName(item, stuff); 
    super(item, stuff); 
    ... 
    } 

} 

要定義拷貝構造函數,也沒有特殊的語法,你基本上是定義一個構造函數的類的其他實例作爲參數。

public ClassName(ClassName other) { 
    field = other.field; 
    field2 = other.field2; 
    field3 = new ArrayList(other.field3); 
    ... 
} 

有沒有這樣的事,作爲一個默認的拷貝構造函數,實際上沒有這樣的事,作爲一個拷貝構造函數,也有隻是一個構造函數。如果您決定創建一個或多個似乎複製對象的對象,那就這樣做吧。

Java需要更少類型的項目的原因有些與不超載基本運算符有關。如果你沒有把更多的意義放在=上,那麼你不需要多種類型的構造函數來支持不同的對象分配方法。

一個是=可以如此簡單使用的原因是由於Java的只有通過引用,這是有點像指針;但是,它們是強類型的,你不能做任何指針數學運算,也不能訪問偏移量。因此,它們僅適用於分配和傳遞參考,這可以防止大多數指針問題。

1

如果你沒有做任何的構造函數,只有一個編譯器隱式添加默認構造函數。它是非參數化的構造函數。

class SomeClass{ 

public SomeClass() // all this is implicitly added if you don't specify anything. 
{ 
super(); 
} 

} 

documentation

編譯器自動提供一個無參數,默認構造函數任何類 沒有構造函數。這個默認構造函數將調用超類的無參構造函數 。在這種情況下,如果超類 沒有參數構造函數,編譯器會發出抱怨,因此您必須驗證它是否有效。如果你的類沒有明確 超,那麼它有對象的隱性超,裏面確實有一個 無參數的構造。

而且在Java中,有沒有這樣的東西拷貝構造函數。如果你明確地定義了一個,那麼這是一個不同的問題,但編譯器不會在Java中自動定義這樣的事情。

7

1.當我創建一個空類時定義了多少個Default構造函數?

一類如

class MyClass { 
} 

具有一個默認(空)的構造,其行爲類似於

... 
    public MyClass() { 
    } 
... 

2.執行I需要定義複製構造函數或它是自動定義在C + +?

沒有在Java中內置的拷貝構造函數的概念,有一個根本原因:

在Java 變量不能包含一個對象(只能包含對象的參考)。所以在做foo(obj)時,obj所指的對象不需要複製。

使對象的副本,您通常會創建一個構造函數,如

... 
    public MyClass(MyClass objToCopy) { 
     this.field1 = objToCopy.field1; 
     ... 
     this.fieldN = objToCopy.fieldN; 
    } 
... 

,或者你依靠clone()機制。

相關問題:

+1

+1的最佳解釋 – 11684

+1

默認的構造函數實際上包含一個'super();',不是嗎? – brimborium

+1

我會說第二部分「如果你想要一個拷貝構造函數,你將不得不自己編寫它」。 – user949300

2

以上所有答案都完全沒有問題..只要多加一個事情更清楚..默認的構造是其中一個編譯器當你沒有定義任何構造函數時自動添加... 根據上述ans:

public ClassName() { super(); }

但是,如果你寫的構造器自己在班級......就像如果你寫相同的構造你自己的類..不是技術上此構造函數就不會被調用默認的構造函數...

我希望你明白了......

1

如果沒有指定構造函數,則會自動定義一個空的構造函數。 只要你指定一個或多個構造函數,只有這些構造函數被定義。

沒有複製構造函數,但Java中的每個類都從作爲clone()方法的Object擴展而來。