Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 私有类的构造函数必须是私有的吗?_Java - Fatal编程技术网

Java 私有类的构造函数必须是私有的吗?

Java 私有类的构造函数必须是私有的吗?,java,Java,如果类是私有的,那么构造函数也必须是私有的吗?否,没有这样的限制。看 值得指出的是,只有嵌套类才能声明为private。JLS允许此类类的构造函数使用任何有效的访问修饰符。如果您指的是嵌套类,答案是否定的。将内部类设为私有将使其仅在外部类中可用 编辑:看起来外部类可以完全访问内部类的内部,而不管它们的访问修饰符是什么。这使我的上述推理无效,但无论如何,没有这样的限制。但奇怪的是,现在看来,如果内部类是private,那么它的构造函数本质上就是private,而不管它的访问修饰符是什么,因为没有人

如果类是私有的,那么构造函数也必须是私有的吗?

否,没有这样的限制。看


值得指出的是,只有嵌套类才能声明为
private
。JLS允许此类类的构造函数使用任何有效的访问修饰符。

如果您指的是嵌套类,答案是否定的。将内部类设为私有将使其仅在外部类中可用


编辑:看起来外部类可以完全访问内部类的内部,而不管它们的访问修饰符是什么。这使我的上述推理无效,但无论如何,没有这样的限制。但奇怪的是,现在看来,如果内部类是
private
,那么它的构造函数本质上就是
private
,而不管它的访问修饰符是什么,因为没有人可以调用它。

不,它不是固定的,您可以将它设置为private/public/任何您想要的

但在某些情况下,当您不想允许其他类创建此类的对象时,我更喜欢将构造函数设置为私有。在这种情况下,您可以通过将构造函数设置为private来执行类似的操作

private class TestClass{
    private TestClass testClass=null;
    private TestClass(){
         //can not accessed from out side
         // so out side classes can not create object
         // of this class
    }

    public TestClass getInstance(){
      //do some code here to
      // or if you want to allow only one instance of this class to be created and used
      // then you can do this
      if(testClass==null)
           testClass = new TestClass();

      return testClass;
    }
}
顺便说一句,这取决于你的要求。

它不必是私人的。但它可以。例如:

public class Outer {

    // inner class with private constructor
    private class Inner {
        private Inner() {
            super();
        }
    }

    // this works even though the constructor is private.
    // We are in the scope of an instance of Outer
    Inner i = new Inner();

    // let's try from a static method
    // we are not in the scope of an instance of Outer
    public static void main(String[] args) {

        // this will NOT work, "need to have Inner instance"
        Inner inner1 = new Inner();

        // this WILL work
        Inner inner2 = new Outer().new Inner();
    }
}

// scope of another class
class Other {
    // this will NOT work, "Inner not known"
    Inner inner = new Outer().new Inner(); 
}
如果在私有内部类上使用
private
public
构造函数,则没有什么区别。原因是内部类实例是外部类实例的一部分。这张照片说明了一切:


请注意,我们讨论的是一个内部类。如果嵌套类是
静态的
,则官方术语是静态嵌套类,这与内部类不同。只需调用
newouter.internal()
,就可以在没有外部类实例的情况下访问公共静态嵌套类。有关内部类和嵌套类的更多信息,请参见此处

没有。相反,如果使用外部类中的私有构造函数(私有类的默认构造函数)创建内部类的实例,Java将创建一个额外的类,以防止访问冲突并使JVM满意

如果你编译这个类

class Test {
    private class Test2 {
        Test2() {
        }
    }
    Test() {
        new Test2();
    }
}
class Test {
    private class Test2 {
    }
    Test() {
        new Test2();
    }
}
javac将创建Test.class,Test@Test2.class

如果你编译这个类

class Test {
    private class Test2 {
        Test2() {
        }
    }
    Test() {
        new Test2();
    }
}
class Test {
    private class Test2 {
    }
    Test() {
        new Test2();
    }
}

javac将创建Test.class,Test@Test2.class,测试$1.class

了解的最好方法是亲自尝试并查看……)顺便说一句,顶级类不能是私有的,只有内部类可以。:)考虑私有类中的非私有构造函数,您将如何从另一个类访问它?答案不是答案不是否定的。您可以创建一个
static
工厂方法,比如
getInstance()
,它反过来调用私有构造函数。在应用单例模式时经常使用。你对此很确定吗?我做了两个实验,我可以从外部类创建内部类的实例,即使内部类的构造函数是
private
@NPE,我是基于逻辑的,但看起来你是对的,这是在被接受的答案不幸是向后的地方解决的。Java中的一条一般规则是,所有
private
成员都可以在它们出现的最外层词法范围内访问。@NPE是对的,内部类的私有构造函数可以从外部类实例访问。这是因为内部类(不是:嵌套类)算作外部类实例的一部分。见我的答案: