【问题标题】:Child Class cannot be protected子类不能被保护
【发布时间】:2015-10-04 05:51:25
【问题描述】:
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 子类设为受保护。为什么是这样?我没有尝试完成任何事情,这只是为了我对访问说明符的理解。

【问题讨论】:

  • 请仔细检查您的包裹。检查这个stackoverflow.com/a/15944571/2445298
  • protected 类应该做什么?它应该允许什么样的访问?
  • 只有一个包,演示包。我还没有创建任何其他包。
  • @Codebender 很好的反问。但是,如果 OP 知道这些问题的答案,他们就不会问这个问题。

标签: java class inheritance protected access-specifier


【解决方案1】:

类定义本身只能是公共的或包私有的。公共类必须在自己的文件中定义,文件名必须是类名。

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

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

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

【讨论】:

    【解决方案2】:

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

    Java 语言规范的Section 8.1.1 是这样说的:

    访问修饰符 protected 和 private 仅适用于直接封闭类声明中的成员类

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

    【讨论】:

      【解决方案3】:

      “为什么我们不能为顶级类添加 'protected' 修饰符”。

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-12
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 2011-10-06
        相关资源
        最近更新 更多