我正在尝试创建一个包含具有不同访问修饰符的类包的项目,以查看具有不同访问修饰符的类的所有特征。我尝试拥有一个带有公共(public)类的包,一个带有默认类,然后尝试拥有另外两个用于 protected 和私有(private)类的包,但它说“私有(private)类的修饰符非法;仅允许公共(public)、抽象和最终”。为什么会这样呢。其次,测试每个类的内容是否是理解它的好方法。我试图提出一个比上一篇文章更好的问题。我还想学习每个访问修饰符的应用。
最佳答案
I tried having a package with a public class, one with a default class and then tried to have 2 other for protected and private classes but it said "Illegal modifier for the class privatez; only public, abstract & final are permitted" for them. Why is this so.
简单的答案是 JLS 规定您不能将顶级类声明为 private
。
原因是拥有一个只对其自身可见的类是没有意义的。任何其他类都不可能使用它(假设除了使用反射的肮脏技巧)。所以 JLS 只是说:“这没有意义,我也不允许。”
(现在嵌套类可以访问private
...但那是因为private
意味着private
到最外层封闭类中的所有类...)
And secondly, is testing stuff for each class a good way to understand it.
我认为最好阅读并尝试理解教科书/教程。问题是,如果您尝试通过编写自己的示例来学习,您很容易从中得出错误的结论。
<小时/>对于这个例子:
package privatez; protected class privatez { }
假设的 protected 类将/可能仅对其子类可见。但是类总是对其子类可见,因此这没有任何意义。 (此外,防止子类化的方法是声明一个类final
,并且您可以使用“package private”来限制子类化;即没有访问修饰符。)
protected
访问修饰符仅对类内部的内容有意义。在顶级类中,protected
的正常含义没有任何意义。
(这是尝试通过示例学习的问题之一。您最终会努力理解编译器拒绝示例的原因。不要指望编译器“解释”为什么出现错误。这不是它的作用。 )
关于java - 练习访问修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11165942/