受保护和默认修饰符 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
方法必须具有相同或较少限制的访问修饰符。
覆盖方法的规则:
- 仅覆盖继承的方法
- 子方法必须与父方法具有相同的签名
- final、private 和 static 方法不能被覆盖
- 必须具有相同的 return 类型或子类型
- 访问修饰符的限制必须低于父级
- 不得抛出新的或更广泛的已检查异常
我很难理解为什么我在使用以下代码时会出错,而在其他情况下却不会:
场景 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
方法必须具有相同或较少限制的访问修饰符。
覆盖方法的规则:
- 仅覆盖继承的方法
- 子方法必须与父方法具有相同的签名
- final、private 和 static 方法不能被覆盖
- 必须具有相同的 return 类型或子类型
- 访问修饰符的限制必须低于父级
- 不得抛出新的或更广泛的已检查异常