受保护和默认修饰符 Java

Protected and default modifier Java

我很难理解为什么我在使用以下代码时会出错,而在其他情况下却不会:

场景 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
}

非常感谢任何帮助。

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

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

在这个子类中可以访问 ClassA 上的打印,但是如果您允许使用更严格的访问修饰符(即默认或私有)进行覆盖,那将不起作用。

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

覆盖方法的规则:

  1. 仅覆盖继承的方法
  2. 子方法必须与父方法具有相同的签名
  3. final、private 和 static 方法不能被覆盖
  4. 必须具有相同的 return 类型或子类型
  5. 访问修饰符的限制必须低于父级
  6. 不得抛出新的或更广泛的已检查异常