Java类构造函数问题

时间:2014-09-25 17:29:12

标签: java

什么是默认类型的构造函数,例如公共/私人/ astract等。

我们可以在java中更改构造函数的类型吗?

当我将构造函数创建为私有时,它不允许访问类,为什么?

5 个答案:

答案 0 :(得分:1)

您可以通过以下方式定义构造函数:

  • public A() - 这意味着每个其他类都可以创建一个A实例。
  • protected A() - 受保护的访问意味着它只能由A实例或其子类访问,但仅限于该子类涉及其父实例的实现。 See this post
  • private A() - 这意味着除了A本身嵌套或封装类之外,没有其他类可以调用构造函数。它经常被用来创造单身人士;使用静态方法创建对象:

    public class A {
    
        private static A instance;
    
        // Make constructor private
        private A() { }
    
        public static A getInstance() {
            // Create an instance if it is not yet created.
            if (A.instance == null) {
                A.instance = new A();
            }
            return A.instance;
        }
    }
    
  • A() - 如果省略了访问修饰符(如public或private),则称为 package-private 。 package-private构造函数只能由该类的相同包或子类中的类访问。

There is a table您可能会觉得有用:

             |Class | Package | Subclass | World
public       | Y    | Y       | Y        | Y
protected    | Y    | Y       | Y        | N
no modifier  | Y    | Y       | N        | N
private      | Y    | N       | N        | N

请注意,无修饰符表示您没有声明修饰符,即省略它。

答案 1 :(得分:1)

如果你编写一个没有访问修饰符的构造函数:

public class MyClass {

    MyClass (int param) {
        // constructor code
    }

}

然后可访问性是包私有,与没有访问修饰符的任何方法的可访问性相同。 (JLS 6.6.1:"在没有访问修饰符的情况下声明的类成员或构造函数隐式具有包访问权。")因此,这是默认的"类型" (实际上是默认的可访问性)构造函数。在此示例中,package-private构造函数意味着您可以在同一个包中的类中使用new MyClass(10),但不能在包外使用。

您可以像使用任何其他方法一样添加辅助功能修饰符:publicprivateprotected。但是,根据JLS 8.8.3,您无法使用其他修饰符,例如abstract

如果你使它private,那么构造函数不能在类之外使用(或者,对于嵌套类,在包含它的顶级类之外),但它可以在里面使用这个班级。这意味着您的类可以定义一个静态工厂方法,该方法实际上不是构造函数,但用于构造类的对象:

public class MyClass {

    private MyClass(int param) { ... }

    public static MyClass CreateObject(String something) {
        // stuff
        return new MyClass(n);
    }

}

单例类也使用类似的习惯用法,其中一个方法像工厂方法一样返回类的实例,但也确保只创建一个实例。

私有构造函数也可以被其他构造函数使用:

public class MyClass {

    private MyClass(boolean isString, String stringParam, int intParam) {
        // stuff
    }

    public MyClass(String stringParam) {
        this(true, stringParam, -1);
    }

    public MyClass(int intParam) {
        this(false, null, intParam);
    }

}

如果您声明了private构造函数并且没有在类中的任何位置使用它,那么这通常用于定义一个类,其唯一目的是提供静态实用程序方法。您可以调用静态方法,但不能创建该类的实例。

答案 2 :(得分:0)

是的,您可以在java中更改构造函数的类型。 默认情况下,构造函数不是public。对于具有默认访问修饰符的类,构造函数访问也是默认的。对于内部类,该类可以具有任何访问修饰符,因此构造函数也将具有相同的访问修饰符,除非我们定义构造函数一个不同的访问修饰符

私人用于单身人士。请注意,如果您这样做,则无法从类外部实例化该类。

对于私有构造函数,您可以执行类似于单例的操作

public class Foo {
    private Foo foo;
    private Foo(){} // default you may not see it in the editor but is provided by complier
    public static Foo getInstance(){ 
        if(foo==null)
           foo=new Foo();
        return foo;
    }
}

答案 3 :(得分:0)

什么是默认类型的构造函数,例如公共/私人/ astract等? 对于default constructor它取决于类的可访问性,如果使用public声明类,则默认构造函数将为public,如果class声明为protected,则默认构造函数将受到保护。
当我将构造函数创建为私有时,它不允许访问类,为什么? 因为构造函数在类外是不可见的。

答案 4 :(得分:0)

如果你有一个构造函数并且它是私有的,那么这意味着没有人可以创建你的类的对象。但是有一种方法可以获得你班级的目标,即使用单音。

public class Foo {

    private static Foo foo;

    private Foo() { }

    public static Foo getInstance() {
        if (foo == null) {
            foo = new Foo();
        }
        return foo;
    }
}