26

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

4

4 回答 4

57

在这方面,构造函数与方法相同——如果你没有给出明确的 public、private 或 protected,那么构造函数将获得默认的“包私有”可见性。它可以从同一个类或同一个包中的任何其他类调用,但不能从不同包中的子类调用(因此,如果一个类只有包可见的构造函数,那么任何子类都必须在同一个包中)。

私有构造函数可防止任何其他类实例化这个类,但您可以在类中拥有一个公共静态工厂方法,该方法调用其自己的私有构造函数。这是单例之类的常见模式。

于 2012-11-24T13:03:33.043 回答
37

JLS 8.8.9 默认构造函数

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

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

于 2012-11-24T12:55:27.370 回答
5

-没有明确定义访问修饰符时, Aconstructor将具有类型的访问控制。所以这个构造函数将有一个Package Level Access。在该包中定义为具有此默认构造函数的类的类将能够访问它,并且扩展包含默认构造函数的此类的类也将能够通过继承访问它。default

-如果构造函数被构造private,那么只有该类中的代码可以访问它。

单例示例

public class Test {

  private static Test uniqueInstance = new Test();

  private Test(){}

  public static Test getInstance(){

    return uniqueInstance;

 }


}

-即使类中的非静态成员 inner classes可以访问其私有成员,反之亦然。

例如:

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();

    }

}
于 2012-11-24T14:03:18.173 回答
2

它取决于您是为常规类还是枚举编写构造函数:

  • 对于课程, JLS §6.6.1给出了答案:

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

  • 对于枚举, JLS §8.9.2给出了答案:

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

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

于 2015-11-16T11:16:40.330 回答