2016-09-20 29 views
0

創建對象我有一個構造函數,需要一些PARAMS像這樣我得到一個怪異的行爲,同時從構造函數的Java

public XYZ(Long param1, boolean param2, Long param3){ 
    //... 
} 

,當我試圖通過使用像new操作符創建該類的對象

XYZ xyz = new XYZ(1L, false,4L); 

(注意沒有虛假,4之間的空間)

我的參數3始終獲得通過如null在java 7中的構造函數。但是,雖然我試圖在IntelliJ Idea中調試時評估相同的表達式,但對象創建工作正常。

這是由於逗號運算符發生的行爲嗎? 。我嘗試閱讀Java語言規範,但無法找到任何關於此。更重要的是寫在幾個地方,雖然對象創建逗號(,)作爲分隔符而不是作爲運營商。

如果我把params之間的正常間距一切工作正常。有人可以解釋這種行爲。如果逗號作爲操作符工作,那麼在創建對象時不應該有編譯時錯誤?

編輯:

感謝每一個爲你的答案。我無法在生產環境之外複製問題,也許我忽視了一些重要的事情。 請將此問題標記爲已關閉。

+1

只是在這裏粘貼你的代碼不僅僅是方法簽名。 – fairjm

+0

它只是一個普通的構造函數,初始化這三個參數 – sjsupersumit

+1

代碼不會在你的例子中編譯,因爲'XYZ'構造函數簽名需要兩個'Long'參數,並且XYZ構造函數調用需要兩個整數作爲參數。這是'構造函數XYZ(int,boolean,int)是未定義的編譯錯誤。 –

回答

2

這是我的嘗試:

public class TestClass { 

    public TestClass(Long param1, boolean param2, Long param3) { 
     System.out.println(param1); 
     System.out.println(param2); 
     System.out.println(param3); 
    } 

    public static void main(String[] args) { 
     new TestClass(1L, false,2L); 
    } 
} 

,輸出是:

1 
false 
2 

也許你需要給我們更多的信息嗎?

+0

注意這個答案和OP之間的區別:參數1和3指定它們是使用L關鍵字的Longs。 – RvdK

+0

@RvdK我認爲這只是一個錯誤的問題。如何在沒有'L'的情況下調用構造函數? –

+0

也許他在課堂上還有一個他不理會的構造函數。 – Knu8

2

Java是強類型語言。在您的代碼示例中,這意味着如果您的類具有帶3個參數的單個構造函數,則編譯器確保必須使用3個參數顯式調用構造函數。運行時情況下逗號被視爲操作員不可能發生,因爲在那種情況下結果只有2個參數。

弱類型像JavaScript這樣的語言兩個參數而不是三個可以產生null作爲第三個參數,但不能在Java中產生。

所以你的問題的答案是這不可能發生在Java

相關問題