受保护和默认修饰符Java

时间:2017-11-21 11:30:06

标签: java access-modifiers

我很难理解为什么我会在下面的代码中出错而不是在其他情况下:

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
}

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:1)

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

覆盖方法的规则:

  1. 仅覆盖继承的方法
  2. 子方法必须与父方法中的方法具有相同的签名
  3. 最终,私有和静态方法无法覆盖
  4. 必须具有相同的返回类型或子类型
  5. 访问修饰符的限制必须少于父级
  6. 不得抛出新的或更广泛的已检查例外

答案 1 :(得分:0)

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

ClassA myClassA = new ClassB();
myClassA.print();
可以在此子类中访问

在ClassA上打印,但是如果您允许使用更具限制性的访问修饰符(即默认或私有)进行覆盖,则无效。