2014-09-12 60 views
2

我知道非常好所有關於Java中,構造我的筆樓下,以確保它的東西:構造在Java中有隱含的返回類型

這可能是乏味的初始化中的每一個類中的所有變量時間創建一個實例。

這將是簡單的有在首次創建對象時所做的所有設置。

因爲用於初始化的要求是如此普遍,Java允許對象初始化自己在創建時。 這種自動初始化是通過使用構造函數來執行的。

構造自動C/D在創建對象後立即是,新的操作員完成之前。 他們沒有返回類型,甚至無效。

閱讀Herbert Schildt完整參考文獻,我遇到了這一段。

類的構造函數的隱式返回類型是類類型本身。構造函數的工作是初始化對象的內部狀態,以便創建實例的代碼立即擁有完全初始化的可用對象。

即使知道好的構造函數沒有返回類型,甚至不存在void,我仍然認爲自己真的和'隱式返回類型'這個術語混淆了。

有人可以嗎?

+0

不知道你的問題,構造是什麼樣的像其他的方法,只不過它返回的類的實例,這是爲什麼你不必做'MyClass MyClass(String param){}'你可以省略第一個MyClass,因爲所有的構造函數都做同樣的事情 – 2014-09-12 19:10:44

+0

這意味着沒有setter和對象的所有字段必須按順序存在創建該類的那個對象。這是確保對象的所有字段都存在的好方法。 – StackFlowed 2014-09-12 19:11:59

回答

0

如果您認爲構造函數是一種方法而不是構造函數,它本質上需要參數並返回對象的新實例。這正是Java 8中發生的情況,您可以使用ClassName::new來獲得工廠方法。

該功能對用戶隱蔽,在構造函數中隱含調用super(),這意味着它們與常規函數/方法不完全相同。從用戶的角度來看,他們沒有返回類型,但您可以將它們視爲具有返回類型。

7

這只是一個令人困惑的文字,基本上。有沒有一個返回類型爲構造函數的概念,就像你說的 - 你可以把它們看成是一個喜歡與同類型的返回類型的方法,但是:

  • 的Java(煩人),您可以直接聲明排序方法的,這是不是構造:

    public class Test() { 
        // This is a spectacularly unhelpful method name. 
        public Test Test() { 
         return new Test(); 
        } 
    } 
    
  • 行爲是不是真的一樣的,特別是當它涉及到鏈構造,所有構造函數的工作同一個對象。

  • 你永遠不會返回任何東西。

我會盡量避免把構造函數看作方法 - 它們有很多特殊的方法。

+0

這些數字只是讓我驚訝,709k 296 4616 5981 – 2014-09-12 19:13:21

+1

@ShirgillAnsari我很驚訝你不知道他是誰! – Abhin 2014-09-12 19:17:37

+0

Java可以讓你做到這一點?爲什麼???? – 2014-09-12 19:17:41

3

如果有任何隱式返回值,我們會在字節碼中看到它。下面是從this article about bytecode拍攝對象初始化的例子:

Job job = new JobImpl(); 
4: aload_0 
5: new #2; //class JobImpl 
8: dup 
9: invokespecial #3; //Method JobImpl."<init>":()V 
12: putfield #4; //Field job:LJob; 
15: return 

5創建新實例。 58都將它放在堆棧上,因此可以通過構造函數調用9彈出兩次,並保存參考12。沒有從構造函數返回的值被保存。

也不存在在構造函數中的字節碼的任何areturn會返回一個值:

public JobImpl(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 
+1

令人驚歎。你採取什麼方法(算法)來給出答案。我會盡力做你的腳步。而上帝是造就了這樣的大腦的人。 – 2014-09-12 19:49:36

+0

@ShirgillAnsari可能'javap -c JobImpl' – fredoverflow 2014-09-13 16:54:34