Child Class 无法保护

Child Class cannot be protected

import java.util.*;

public class NewTreeSet2{
    void count(){
        for (int x=0; x<7; x++,x++){
            System.out.print(" " + x);
        }
    }
}
protected class NewTreeSet extends NewTreeSet2{
    public static void main(String [] args){
        NewTreeSet2 t = new NewTreeSet2();
        t.count();
    }
}

在这里,我无法将 NewTreeSet 子 class 设置为受保护。为什么是这样?我并不想完成任何事情,这只是为了我对访问说明符的理解。

一个class定义本身只能是public或package-private。 Public classes 必须在它们自己的文件中定义并且文件名必须是 class 名称。

The documentation 没有说明 为什么 顶层只有两个访问修饰符,但有人可能会说这是合乎逻辑的:

  • protected 访问修饰符确保只有相同或子 class 的实例才能访问主题。多态性不适用于 classes,仅适用于 classes 的实例。因此 protected 关键字没有意义。

如果你想保护对象的构造,你应该为你的构造函数指定一个访问修饰符。

public 是唯一可以显式应用于 Java 中顶级 class 的访问修饰符。 protected 修饰符在 class 的情况下只能应用于内部 classes.

Java 语言规范的

Section 8.1.1 是这样说的:

The access modifiers protected and private pertain only to member classes within a directly enclosing class declaration

那么为什么顶级 class 不能标记为 protectedJava 中的 protected 访问修饰符的目的是对 class 的成员的访问添加限制。由于顶级 class 不是任何 class 的成员,因此 protected 访问修饰符对于顶级 class 没有意义。内部 classes 可以标记为 protected 因为它们确实是 class 的成员。同样的规则也适用于 private

"Why can't we have the 'protected' modifier for a top-level class"。

假设允许对 class 使用 protected 修饰符。然后会发生什么,它将对同一包中的所有 classes 可见,这与默认(包级别)访问 class 将拥有的行为相同。此外,这个 'protected' class 也应该对包外的所有子 class 可见。但不幸的是,您将无法在包外创建此 class 的任何子 class,因为此 class 本身在包外不可见。因此,如果没有 subclass 特定行为,此 'protected' class 将与包级别或默认访问 class 完全相同。因此,classes 绝对不需要 'protected' 修饰符,因此也是不允许的。

---这是B Verma在另一个论坛上发布的,根据你们所有人所说的找到了这个答案。真的很有帮助,谢谢。

http://www.coderanch.com/t/585021/java/java/Protected-access-modifier-class-level