Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 练习访问修饰符_Java - Fatal编程技术网

Java 练习访问修饰符

Java 练习访问修饰符,java,Java,我正在尝试创建一个包含具有不同访问修饰符的类包的项目,以查看具有不同访问修饰符的类的所有特性。我试着用一个带有公共类的包,一个带有默认类,然后试着用另外两个用于受保护类和私有类,但它说“privatez类的非法修饰符;只允许public、abstract和final”用于它们。为什么会这样。第二,测试每门课的内容是理解它的好方法吗。我想提出一个比上一篇文章更好的问题。我还想学习每个访问修饰符的应用 我试着用一个带有公共类的包,一个带有默认类,然后试着用另外两个用于受保护类和私有类,但它说“pri

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

我试着用一个带有公共类的包,一个带有默认类,然后试着用另外两个用于受保护类和私有类,但它说“privatez类的非法修饰符;只允许public、abstract和final”用于它们。为什么会这样

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

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

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

第二,测试每门课的内容是理解它的好方法吗

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


对于此示例:

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

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


(这是一个试图通过示例学习的问题。你最终很难理解为什么编译器拒绝示例。不要期望编译器“解释”为什么出错。这不是它的角色。)

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

类访问修饰符:

公开

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

默认值

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

只是澄清一下:

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

假设有一个
受保护的
类概念,那么该类对同一包中的子类是可见的,如果不定义任何修饰符,情况就是这样

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

摘要

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

决赛

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


但是受保护的类可能对同一个包之外的子类可见,因此不值得允许使用受保护的类吗?我需要查看您编写/编译的确切代码来回答这个问题。以及确切的编译错误消息。+1表示如果存在受保护的类概念,则该类将对同一包中的子类可见,如果不定义任何修饰符,则情况就是如此。包privatez;受保护的类privatez{}它表示“privatez类的非法修饰符;“只允许公开、抽象和最终版本”“@AnthonyPegram的可能副本我把它变成了一个更好的问题,并实际解释了我的疑惑。这不是重复。