【问题标题】:Why parent class may not be protected? (Java)为什么父类可能不受保护? (爪哇)
【发布时间】:2014-05-16 12:56:32
【问题描述】:

我不知道为什么在下面这样的上下文中

class Parent {

    private void method1() {
        System.out.println("Parent's method1()");
    }


    public void method2() {
        System.out.println("Parent's method2()");
    }   

}


public class Child extends Parent {

    public void method1() {
        System.out.println("Child's method1()");                
    }


    public static void main(String args[]) {
        Parent p = new Child();
        p.method2();
    }

}

Parent 可能是包私有的,但不受保护。

具体产生的错误是

此处不允许使用受保护的修饰符

似乎表明这是一个访问权限问题 - 但我怀疑这可能是一个红鲱鱼。 Private 修饰符也会生成错误(自然)。

【问题讨论】:

    标签: java oop protected


    【解决方案1】:

    在 Java 中,顶级类只能有包私有和公共修饰符。

    开设课程private 没有任何意义。如果没有人出于任何原因使用该类,那么我们为什么需要该类?

    protected 访问修饰符意味着,仅在封闭类和任何子类中可见,并且在封闭类的包中的任何位置可见。没有人知道哪些类将成为受保护类的子类。所以,这也没有意义

    但私有和受保护都可以(并且经常)应用于嵌套类和接口,但绝不会应用于顶级类和接口

    【讨论】:

    • 确切地说是顶级课程。嵌套类可以是受保护的或私有的。
    • 请注意,这不适用于内部类。
    • 哦,是的,在顶级课程中不允许私有是有意义的;但是为什么禁止在顶层保护有什么特别的原因?
    【解决方案2】:

    您不能对顶级类使用受保护的访问修饰符。

    根据spec $8.1.1

    访问修饰符 public (§6.6) 仅适用于顶级类 (§7.6) 和成员类 (§8.5),不适用于本地类 (§14.3) 或匿名类 (§15.9.5)。

    访问修饰符 protected 和 private (§6.6) 仅适用于 直接封闭类或枚举声明中的成员类 (§8.5)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 2014-07-07
      • 2022-10-16
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      相关资源
      最近更新 更多