編譯器警告通知有些說明會發生什麼。如果一個子類重寫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