Java构造函数的默认访问修饰符

时间:2012-11-24 12:53:04

标签: java constructor access-modifiers

有人可以解释显式无参数构造函数(和其他构造函数)的默认访问修饰符是什么?

4 个答案:

答案 0 :(得分:46)

构造函数与此方面的方法相同 - 如果您不提供显式public,private或protected,则构造函数将获得默认的“package private”可见性。它可以在同一个类中或从同一个包中的任何其他类调用,但不能从另一个包中的子类调用(因此,如果一个类只有包可见的构造函数,那么任何子类必须在同一个包中)。 / p>

私有构造函数阻止任何其他类实例化此类,但您可以在类中调用自己的私有构造函数的公共静态工厂方法。这是像单身人士这样的常见模式。

答案 1 :(得分:28)

JLS 8.8.9默认构造函数

  

如果某个类不包含构造函数声明,则会自动提供不带参数的默认构造函数:

     

如果该类被声明为public,则默认构造函数被隐式赋予访问修饰符public;
      如果该类被声明为protected,则默认构造函数被隐式赋予访问修饰符protected;
      如果该类被声明为private,则默认构造函数被隐式赋予访问修饰符private;否则,
      默认构造函数具有默认访问权限隐含的默认访问权限。

答案 2 :(得分:4)

- 没有访问修饰符时,constructor将具有default类型的访问控制定义明确。因此,此构造函数将具有包级别访问。使用此默认构造函数在该包中定义的类将能够访问它,并且扩展包含默认构造函数的类的类将能够通过继承访问它。

- 如果构造函数private,那么只有该类中的代码才能访问此内容。

单例示例

public class Test {

  private static Test uniqueInstance = new Test();

  private Test(){}

  public static Test getInstance(){

    return uniqueInstance;

 }


}

- 即使在课程中非静态 inner classes也可以访问其私人会员,反之亦然。 < / p>

<强>例如

public class T {


    private T(){

        System.out.println("Hello");
    }

    class TT{

        public TT(){

            new T();
        }
    }

    public static void main(String[] args){

        T t = new T();
        T.TT i = t.new TT();

    }

}

答案 3 :(得分:1)

根据您是为常规类还是枚举编写构造函数,它会有所不同:

  • 对于课程,答案由JLS §6.6.1提供:

      

    声明没有访问修饰符的类成员或构造函数隐式具有访问权限。

  • 对于枚举,答案由JLS §8.9.2提供:

      

    在枚举声明中,没有访问修饰符的构造函数声明是私有

    (Enum构造函数总是私有的,以防止其他类实例化更多的枚举常量。)