Java 构造函数具有比其类更广泛的访问级别

Posted

技术标签:

【中文标题】Java 构造函数具有比其类更广泛的访问级别【英文标题】:Java constructor having broader access level than its class 【发布时间】:2012-05-19 19:28:45 【问题描述】:

Java 规范允许具有默认访问权限的类对其构造函数进行公共访问,这样做的目的是什么,因为它不能在其包之外被引用?

【问题讨论】:

我认为这个问题更像是为什么构造函数可以拥有比类更广泛的访问权限。我看不出任何答案如何解释这一点。 【参考方案1】:

如果您要问为什么可以拥有public 构造函数:这是因为您可以在扩展基类时显式(或隐式)调用它们。

【讨论】:

是的,但如果类不能从其他包扩展,则没有公共构造函数的目的。 感谢您的回答,直到@user439407 说明了情况,我才明白。【参考方案2】:

我想对此发表评论,但由于 cmets 中不允许使用代码标签....

关于您对 CristopheDs 回答的评论:

package bob;

class MySuperHiddenClass 

  public MySuperHiddenClass() 
        System.out.println("bob");
  

package bob;
public class MyPublicClass extends MySuperHiddenClass 


MyPublicClass 中没有声明构造函数,但您仍然可以从任何包中调用 new MyPublicClass。

【讨论】:

即使 MySuperHiddenClass 的构造函数不是公共的,您也可以从任何包中调用 new MyPublicClass。我不明白这是如何回答这个问题的。【参考方案3】:

类的可见性决定了外部世界如何创建类的实例。因此包私有类只能在它们声明的包中实例化。方法可见性(包括构造函数)决定了已实例化的实例如何在其类定义之外使用。

如果你声明一个包私有类,带有一个私有/受保护的构造函数,你将如何从同一个包中的另一个类实例化它?

两件事: 类可见性 - 确定如何在其定义包之外创建实例。 方法可见性(包括构造函数) - 确定如何控制对成员的访问,而不考虑包的可见性。

【讨论】:

以上是关于Java 构造函数具有比其类更广泛的访问级别的主要内容,如果未能解决你的问题,请参考以下文章

如何声明其类没有默认构造函数的对象数组?

如果对象没有默认构造函数并且我不允许在其类定义中创建一个对象,如何将对象放入节点中?

Java构造器的理解

在Java中的包级别打印构造函数[重复]

Java编程思想 学习笔记5

Kotlin:为什么构造函数参数默认具有“内部”可见性?