编译器警告通知有些说明会发生什么。如果一个子类重写doSomething方法,它可以改变创建类实例时的行为,这可能是危险的或不是,这取决于你的设计。请注意,这是一个警告,而不是编译器异常。
为了证明这一点,只是扩展你的代码进行测试:
class SomeClass {
public SomeClass() {
doSomething();//Warning - Overridable method call in constructor
SomeClass.this.doSomething();//Seems OK, but is not
}
public void doSomething() {
System.out.println("parent");
}
}
public class SomeOtherClass extends SomeClass {
@Override
public void doSomething() {
System.out.println("child");
}
public static void main(String[] args) {
SomeClass a = new SomeClass();
SomeOtherClass b = new SomeOtherClass();
}
}
打印:
parent
parent
child
child
如果你只是想,没有其他类可以覆盖doSomething
方法,其标记为final
:
class SomeClass {
public SomeClass() {
doSomething();//Warning - Overridable method call in constructor
SomeClass.this.doSomething();//Seems OK
}
public final void doSomething() {
System.out.println("parent");
}
}
然后,如果任何子类试图覆盖它,c ompiler会抛出一个错误:
public class SomeOtherClass extends SomeClass {
@Override
public void doSomething() { //compiler error
System.out.println("child");
}
//...
}
编译器警告通知有点说明会发生什么。如果一个子类覆盖了'doSomething'方法,它可以改变创建类实例时的行为,这可能是危险的或者不是,这取决于你的设计。请注意,这是一个警告,而不是编译器异常。 –
你想让这个方法被覆盖吗?如果是,不,或依赖于谁?然后为您的doSomething()方法使用public,private或protected/package作用域 –
关于“如何正确完成”:如果可能,您可以尝试避免这样的事情。要么不要调用该方法,要么将其声明为“final”。这并不总是可能,但你至少应该考虑它。 – Marco13