2017-05-03 74 views
0

剛剛注意到當我創建模型時,我能夠創建一個私有構造函數 ...可能只需要確認java或eclipse的bug。我知道這是有點不可能的,但嘗試一下自己。從私有構造函數創建對象 - eclipse/java bug?

創建任何模型即。

//case1 
public class Main { 

private Main(){} 
public Main(Double...doubles){} 
} 

通常情況下,您無法創建對象Main m = new Main();但是當u建立這樣一個模型:

//case2 
public class Main { 

private Main(){} 
public Main(Double [] doubles){} 
} 

您是無法創建和對象主要M =新的Main();

它是如何設想的?將不勝感激任何解釋。

的Java:建立1.8.0_131-B11

的Eclipse:版本:Neon.3版本(4.6.3)

+0

的[?在Java中的構造函數可以是私有]可能的複製(http://stackoverflow.com/questions/2816123/can-a-constructor-in-java - 私人) –

+0

「可能是java [原文如此]或eclipse [原文如此] bug」 - 嗯,是的,你永遠不會有這種情況。也可以從調試工具包中永久刪除這個猜想。那只是一廂情願的神奇的想法。 –

回答

3

這不是一個錯誤。在情況2中,實際上是在創建一個私有構造函數,這意味着您無法使用不帶args的默認構造函數實例化Main的對象。您只能在定義它的同一個類中使用私有構造函數構造一個對象。

public class Main { 

    private Main() { 
    } 

    public Main(Double[] doubles) { 
    } 

    public void testPrivateConstructor() { 
     Main mainObjectInsideTheSameClass = new Main(); 
    } 
} 

你的情況1中的第二個構造函數是公共的,它需要可變數目的參數。所以當你使用Main m = new Main()創建一個對象時,你實際上正在使用第二個公共構造函數,並且你正在傳遞零參數。

案例2的具體使用案例之一是Java中的單例模式
參見:Can a constructor in Java be private?

+0

我可以這麼做......嘗試自己 – Michael

+0

你不能通過'Main m = new Main();'創建對象。您將使用其他構造函數並傳遞一個'Double'數組.. –

+0

你試過了嗎?創建一個模型,就像我剛剛寫的,另一個類用'public static void main(String [] args){'嘗試自己...也許它只是我的日食... – Michael

0

這就是它應該怎樣做。您可以使用Java創建私有構造函數。請看這link

0

您可以在任何的那類方法使用私有構造函數(即使該方法是靜態的)。

創建testA使用TestA(Double... d)構造函數。 Double...它是可變參數它允許傳遞零或多個參數。

public class Main 
{ 
    private Main() 
    { 
     System.out.println("Main1"); 
    } 

    public Main(Double[] d) 
    { 
     System.out.println("Main1 " + (Arrays.toString(d))); 
    } 

    public static void main(String[] args) 
    { 
     TestA testA = new TestA(); //match to TestA(Double... d) with zero args 
//  TestB testB = new TestB(); //ERROR don't match to TestB(Double[] d) 
     Main main = new Main(); //you can use private constructors in class 
    } 
} 

class TestA 
{ 
    private TestA() 
    { 
     System.out.println("TestA1"); 
    } 

    public TestA(Double... d) 
    { 
     System.out.println("TestB2 " + (Arrays.toString(d))); 
    } 
} 

class TestB 
{ 
    private TestB() 
    { 
     System.out.println("TestB1"); 
    } 

    public TestB(Double[] d) 
    { 
     System.out.println("TestB2 " + (Arrays.toString(d))); 
    } 
} 

日期:

TestA2 [] 
Main1 
相關問題