练习访问修饰符

时间:2012-06-23 01:03:31

标签: java

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

2 个答案:

答案 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类概念,那么该类对同一个包中的子类是可见的,如果你没有定义任何修饰符就是这种情况。

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

<强>抽象

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

<强>最终

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

For more details about java as language read