刚刚注意到我在创建模型时我能够创建一个私有构造函数 ...可能java或eclipse错误只需要确认。我知道这有点不可能,但试试自己。
创建任何模型即
//case1
public class Main {
private Main(){}
public Main(Double...doubles ){}
}
通常你不能创建一个对象 Main m = new Main(); 但是当你创建一个这样的模型时:
//case2
public class Main {
private Main(){}
public Main(Double [] doubles ){}
}
您无法创建并对象 Main m = new Main(); 。
它的假设是什么?将不胜感激任何解释。
Java:build 1.8.0_131-b11
Eclipse:版本:Neon.3发布(4.6.3)
答案 0 :(得分:3)
这不是一个错误。在案例2中,您实际上是在创建一个私有构造函数,这意味着您无法使用不带Main
的默认构造函数来实例化args
的对象。您只能使用私有构造函数在定义它的同一个类中构造一个对象。
public class Main {
private Main() {
}
public Main(Double[] doubles) {
}
public void testPrivateConstructor() {
Main mainObjectInsideTheSameClass = new Main();
}
}
案例1中的第二个构造函数是公共的,它需要可变数量的参数。因此,当您使用Main m = new Main()
创建对象时,您实际上正在使用第二个公共构造函数,并且您传递零参数。
案例2的具体用例之一是Java中的 singleton pattern 请参阅:Can a constructor in Java be private?
答案 1 :(得分:0)
它应该是怎样的。您可以使用Java创建私有构造函数。请参阅此link
答案 2 :(得分:0)
您可以在任何类方法中使用私有构造函数(即使该方法是静态的)。
创建testA
使用TestA(Double... d)
构造函数。
Double...
varargs 允许传递零或多个参数。
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