练习访问修饰符

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

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

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

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

(现在一个嵌套可以访问private …但这是因为private对于最外层封闭类中的所有类都是private …)

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

我认为最好阅读并尝试理解教科书/教程。 问题是如果你试着通过编写自己的例子来学习,你可以很容易地从他们那里得出错误的结论。


对于这个例子:

 package privatez; protected class privatez { } 

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

protected访问修饰符仅对类中的内容有任何意义。 在顶级课程中, protected的正常含义没有任何意义。

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

如果你想学习,你应该读一些关于java的书。 在这里,我可以给你一个小小的要点:

类访问修饰符:

上市

类可以在它所属的包外部访问。

默认

这是你不指定任何东西的时候。 该类可以从包中访问,它是一部分。

只是为了澄清:

private修饰符没有意义。 因为没有人可以访问私有类,无论是扩展还是实例创建。

假设有一个protected类概念,那么该类对同一个包中的子类是可见的,如果你没有定义任何修饰符就是这种情况。

其他类属性(这些不是访问修饰符):

抽象

如果已定义,则类的用户无法创建它的实例。 扩展它的类必须实现抽象方法或将自己定义为抽象方法。

最后

如果已定义,则用户无法扩展此类。

有关java作为语言读取的更多详细信息