【问题标题】:Practicing Access Modifiers练习访问修饰符
【发布时间】:2012-06-25 07:51:52
【问题描述】:

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

【问题讨论】:

  • Practice Access Modifiers的可能重复
  • @AnthonyPegram 我把它变成了一个更好的问题,实际上解释了我想知道的。这不是重复。

标签: java


【解决方案1】:

我尝试了一个带有公共类的包,一个带有默认类的包,然后尝试为受保护和私有类设置另外 2 个包,但它说“privatez 类的修饰符非法;只允许公共、抽象和最终”为他们。为什么会这样。

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

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

(现在嵌套可以访问private ...但这是因为private对最外层封闭类中的所有类意味着private ...)

其次,测试每个类的内容是否是理解它的好方法。

我认为最好阅读并尝试理解教科书/教程。问题是,如果您尝试通过编写自己的示例来学习,您很容易从中得出错误的结论。


对于这个例子:

package privatez; protected class privatez { }

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

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

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

【讨论】:

  • 但是受保护的类可能对同一个包外的子类可见,所以不值得允许受保护
  • 我需要查看您编写/编译的确切代码来回答这个问题。以及确切的编译错误消息。
  • +1 说如果有一个受保护的类概念,那么该类将对同一个包中的子类可见,如果你不定义任何修饰符就是这种情况。
  • 包私有; protected class privatez { } 它说“”类 privatez 的非法修饰符;只允许公开的、抽象的和最终的""
【解决方案2】:

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

类访问修饰符:

公开

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

默认

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

澄清一下:

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

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

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

抽象

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

最终

如果定义,用户不能扩展这个类。

For more details about java as language read

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 2017-08-18
    • 2013-05-25
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多