练习访问修饰符

Chr*_*yen 2 java

我正在尝试使用具有不同访问修饰符的类包来创建项目,以查看具有不同访问修饰符的类的所有特征.我尝试了一个带有公共类的包,一个带有默认类,然后尝试为受保护和私有类提供另外两个,但是它说"私有类的非法修饰符;只允许使用public,abstract和final".为什么会如此.其次,测试每个类的东西是理解它的好方法.我想提出比上一篇文章更好的问题.我还想学习每个访问修饰符的应用.

Ste*_*n C 5

我尝试了一个带有公共类的包,一个带有默认类,然后尝试为受保护和私有类提供另外两个,但是它说"私有类的非法修饰符;只允许使用public,abstract和final".为什么会如此.

简单的答案是JLS表示你不能将顶级类声明为private.

原因是拥有一个只对自己可见的类是没有意义的.任何其他类都无法使用它(除此之外,假设使用反射的脏技巧).所以JLS只是说:"它没有意义,我不允许它."

(现在一个嵌套可以访问private...但那是因为对最外层封闭类中所有类的private方法private......)

其次,测试每个类的东西是理解它的好方法.

我认为最好阅读并尝试理解教科书/教程.问题在于,如果您尝试通过编写自己的示例来学习,您可以轻松地从中得出错误的结论.


对于这个例子:

package privatez; protected class privatez { }
Run Code Online (Sandbox Code Playgroud)

假设的protected类只能对其子类可见.但是类的子类总是可见的,所以这没有任何意义.(此外,防止子类的方法是声明一个类final,并且可以使用"package private"来限制子类;即没有访问修饰符.)

protected访问修饰符才有的东西,任何意义上的内部类.在顶级课程中,正常含义protected没有任何意义.

(这是尝试通过示例学习的问题之一.您最终难以理解编译器拒绝示例的原因.不要指望编译器"解释"为什么出错.这不是它的作用.)