2017-05-03 122 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 
相关问题