我现在正在学习重写,并且我读到私有方法无法被覆盖here
我还读到访问级别不能比超类访问级别here更具限制性
所以我想知道的是,这是否意味着你只能覆盖公共方法?而你的新方法也必须公开吗?
方案
class A {
private void method1(){
....
}
}
class B extends A {
private void method1(){
....
}
}
我是否正确地说这将是一个编译时错误,因为私有方法无法被覆盖?
Scenario2
class A {
public void method1(){
....
}
}
class B extends A {
private void method1(){
....
}
}
我是否正确地说这也会产生编译时错误,因为method1()
中的B
访问级别比method1()
中的A
更具限制性{ p>
场景3
class A {
public void method1(){
....
}
}
class B extends A {
public void method1(){
....
}
}
最后一个问题,这是唯一可以覆盖的场景方法吗? (两个访问级别都是公开的)
答案 0 :(得分:3)
假设班级:
class A {
public void method1() { }
protected void method2() { }
private void method3() { }
void method4() { }
}
然后
class B extends A {
@Override
public void method1() {
// this method DOES override the Method1
}
@Override
protected void method2() {
// this method DOES override the Method2
super.method2();
}
private void method3() {
// this method DOES NOT override the Method3
}
@Override
void method4() {
// this method DOES override the Method4
super.method4();
}
}
并且在所有情况下,重写的方法都不会比超类中的方法更不可见。
答案 1 :(得分:1)
是的,您可以覆盖公共或受保护的方法。你不能覆盖私人方法。
那就是说,你的第一个代码片段不会产生编译错误。 A
和B
都有method1()
,但B
的方法不会覆盖A
的方法。
第二个片段确实无法通过编译,因为您无法降低继承方法的可见性。
第三个代码段是您发布的代码中唯一的方法覆盖情况。