【问题标题】:Protected and default modifier Java [duplicate]受保护和默认修饰符Java [重复]
【发布时间】:2018-05-04 20:30:58
【问题描述】:

我很难理解为什么我在以下代码中出现错误,而在其他情况下却没有:

场景 1(有错误)

class App{
public  static void main(String[]args) {
    ClassA a = new ClassB();
    a.print();  
    }
}

class ClassA {       
    protected void print() {}   
}

class ClassB extends ClassA {
     void print(){}
     //creates error: Cannot reduce the visibility of the inherited method from ClassA
}

场景 2(无错误)

class App{
public  static void main(String[]args) {
    ClassA a = new ClassB();
    a.print();  
    }
}

class ClassA {       
    protected void print() {}   
}

class ClassB extends ClassA {        
    protected void print(){}
     //no error/ Override method
}

非常感谢任何帮助。

【问题讨论】:

  • 私有包的可见性低于protected,这就是编译器暗示你的,你可以通过省略protected来降低可见性,这是​​不允许的。

标签: java access-modifiers


【解决方案1】:

您的错误消息几乎解释了它为什么不起作用。默认访问修饰符比受保护的访问修饰符更具限制性。如果您从可以访问 print 的上下文中尝试以下操作(即在 ClassB 的子类中),这会给您带来问题:

ClassA myClassA = new ClassB();
myClassA.print();

在这个子类中可以访问 ClassA 上的打印,但如果您允许使用限制性更强的访问修饰符(即默认或私有)进行覆盖,则将无法正常工作。

【讨论】:

    【解决方案2】:

    默认访问修饰符 (no keyword) 比 protected 访问修饰符更具限制性,这意味着当方法具有 protected 访问修饰符时,它仅对同一包中的类和 sub-classes 可见。 另一方面, (no keyword) 访问修饰符只能用于同一包中的类。 您必须知道的另一件事是,最重要的规则之一是 overridden 方法必须具有相同或限制较少的访问修饰符。

    重写方法的规则:

    1. 只覆盖继承的方法
    2. 子中的方法必须与父中的方法具有相同的签名
    3. 不能覆盖最终、私有和静态方法
    4. 必须具有相同的返回类型或子类型
    5. 访问修饰符的限制性必须低于父项中的限制
    6. 不得抛出新的或更广泛的已检查异常

    【讨论】:

    • 非常感谢艾哈迈德。我不知道规则 5 艾哈迈德。
    猜你喜欢
    • 2019-05-07
    • 2011-12-29
    • 2015-02-11
    • 1970-01-01
    • 2012-03-25
    • 2013-04-03
    • 2010-12-05
    • 2013-03-05
    相关资源
    最近更新 更多