我正在尝试使用具有不同访问修饰符的类包创建一个项目,以查看具有不同访问修饰符的类的所有特征。我尝试了一个带有公共类的包,一个带有默认类的包,然后尝试为受保护类和私有类设置另外两个包,但它对它们说“privatez 类的非法修饰符;只允许 public、abstract 和 final”。为什么会这样。其次,为每个类测试东西是理解它的好方法。我试图提出比上一篇文章更好的问题。我还想学习每个访问修饰符的应用。
2 回答
我尝试了一个带有公共类的包,一个带有默认类的包,然后尝试为受保护类和私有类设置另外两个包,但它对它们说“privatez 类的非法修饰符;只允许 public、abstract 和 final”。为什么会这样。
简单的答案是 JLS 说您不能将顶级类声明为private
.
原因是拥有一个只对自己可见的类是没有意义的。任何其他类都无法使用它(假设除了使用反射的肮脏技巧)。所以 JLS 只是说:“这没有意义,我不允许这样做。”
(现在嵌套类可以访问private
......但那是因为最外层封闭类中所有类的private
手段......)private
其次,为每个类测试东西是理解它的好方法。
我认为最好阅读并尝试理解教科书/教程。问题在于,如果您尝试通过编写自己的示例来学习,您很容易从中得出错误的结论。
对于这个例子:
package privatez; protected class privatez { }
一个假设的protected
类将/可能只对其子类可见。但是类总是对其子类可见,所以这没有任何意义。(此外,防止子类的方法是声明一个类final
,您可以使用“包私有”来限制子类化;即没有访问修饰符。)
访问修饰符仅对类中的protected
内容有意义。在顶级课程中, 的正常含义没有任何意义。protected
(这是尝试通过示例学习的问题之一。您最终会努力理解为什么编译器会拒绝示例。不要指望编译器“解释”为什么出了问题。这不是它的作用。)
如果你想学习,你应该阅读一些关于java的书。在这里我只能给你一个小要点:
类访问修饰符:
上市
类可以在它所属的包之外访问。
默认
这是你不指定任何东西的时候。可以从包中的 with 访问该类,它是其中的一部分。
只是为了澄清:
private
修饰符没有意义。由于没有人可以访问私有类,既不能用于扩展也不能创建实例。
假设如果有一个protected
类概念,那么该类将对同一个包中的子类可见,如果你不定义任何修饰符就是这种情况。
其他类属性(这些不是访问修饰符):
抽象的
如果定义,该类的用户不能创建它的实例。扩展它的类必须实现抽象方法或将自己定义为抽象。
最终的
如果已定义,则用户不能扩展此类。