我很难理解为什么我会在下面的代码中出错而不是在其他情况下:
SCENARIO 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
}
SCENARIO 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
}
任何帮助都非常感激。
答案 0 :(得分:1)
默认访问修饰符(no keyword
)比protected
访问修饰符更具限制性,这意味着当方法具有protected
访问修饰符时,它只对同一个包中的类可见且{ {1}}。
另一方面,(sub-classes
)访问修饰符只能用于同一包中的类。
您必须知道的另一件事是最重要的规则之一是no keyword
方法必须具有相同或限制较少的访问修饰符。
覆盖方法的规则:
答案 1 :(得分:0)
您的错误消息几乎可以解释为什么它不起作用。默认访问修饰符比受保护的访问修饰符更具限制性。如果您在可以访问print的上下文中尝试以下内容(即在ClassB的子类中),这将给您带来问题:
ClassA myClassA = new ClassB();
myClassA.print();
可以在此子类中访问在ClassA上打印,但是如果您允许使用更具限制性的访问修饰符(即默认或私有)进行覆盖,则无效。