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