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

Posted

技术标签:

【中文标题】Java 构造函数的默认访问修饰符【英文标题】:Default access modifier for a Java constructor 【发布时间】:2012-11-12 13:04:36 【问题描述】:

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

【问题讨论】:

另见,隐式/默认构造函数:What's the access modifier of the default constructor in java? 【参考方案1】:

JLS 8.8.9 默认构造函数

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

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

【讨论】:

OP 专门询问“显式无参数构造函数”,而不是默认构造函数。 @Raedwald:除了参数化构造函数之外,当我们添加无参数构造函数时工作。【参考方案2】:

在这方面,构造函数与方法相同 - 如果您没有明确指定公共、私有或受保护,那么构造函数将获得默认的“包私有”可见性。它可以从同一个类或同一个包中的任何其他类调用,但不能从不同包中的子类调用(因此,如果一个类只有包可见的构造函数,则任何子类都必须在同一个包中)。

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

【讨论】:

【参考方案3】:

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

- 如果 构造函数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();

    


【讨论】:

【参考方案4】:

这取决于您是为普通类还是枚举编写构造函数:

对于类,答案由JLS §6.6.1给出:

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

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

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

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

【讨论】:

以上是关于Java 构造函数的默认访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章

Java中的构造函数是不是有访问修饰符继承?

JAVA中的四种作用域访问修饰符以及各自的关键字个特点是?

在类的构造函数上使用受保护的访问修饰符

java类中的成员缺省(默认的)的修饰符是啥??

面试题解五 访问修饰符的区别

Java中的访问修饰符