2014-02-13 117 views
0

這兩個調用有什麼區別?這應該如何正確完成?構造函數中的可重寫方法調用 - 調用方法的正確方法是什麼?

//package test; 

public class SomeClass { 

    public SomeClass() { 

     doSomething();//Warning - Overridable method call in constructor 
     SomeClass.this.doSomething();//Seems OK 
    } 

    public void doSomething() { 
     //... 
    } 
} 

我想使用doSomething()只是爲了方便在同一班。我無意在以後重寫它。一個想法是宣佈它final。但仍然不清楚在這種情況下是否可以安全使用SomeClass.this.doSomething();

+1

編譯器警告通知有點說明會發生什麼。如果一個子類覆蓋了'doSomething'方法,它可以改變創建類實例時的行爲,這可能是危險的或者不是,這取決於你的設計。請注意,這是一個警告,而不是編譯器異常。 –

+0

你想讓這個方法被覆蓋嗎?如果是,不,或依賴於誰?然後爲您的doSomething()方法使用public,private或protected/package作用域 –

+1

關於「如何正確完成」:如果可能,您可以嘗試避免這樣的事情。要麼不要調用該方法,要麼將其聲明爲「final」。這並不總是可能,但你至少應該考慮它。 – Marco13

回答

2

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

非常好的例子,謝謝:)我現在明白了。另外 - 'SomeClass.this.doSomething();' - 我認爲在這種情況下是可以的 - 我認爲如果它稍後會被覆蓋並沒有什麼區別 - 該方法將被按原樣從SomeClass中調用。我對嗎? –

+0

@ErnestasGruodis否,因爲您調用'this',它將調用當前對象實例並執行屬於當前對象類型的方法。否則,可能會打印*父親父母孩子父母*。 –

+0

是的,你是對的.. :)愚蠢的我可以說什麼:)它是如此簡單..現在的問題是100%的回答。確實感謝您的幫助。 –

相關問題