2014-05-17 84 views
1
class T {} 

interface Interface{ 
    void method(final T t); 
} 

class FirstClass implements Interface{ 

    public void method(T t){ 
     //valid 
    } 

    public void method2(final T t){ 

    } 
} 

class SecondClass extends FirstClass { 
    public void method2(T t){ 
     //valid 
    } 
} 

與最終預選賽覆蓋在上面的代碼,爲什麼不考慮最終預選賽,而覆蓋的方法?方法簽名參數

我對方法簽名中的最終限定符的理解是,該方法不允許更改引用。但我不明白它有什麼用處呢?

比方說,我使用的是第三方罐子,我對此感到第三方罐子應該不會改變我的目標,同時它處理,代碼應該是這樣的擔憂,

3rdPartyClass.doProcess((final) myObject); 

class 3rPartyClss { 
    public void doProcess(SomeClass myObject){} 
} 

但爲什麼它的像

3rdPartyClass.doProcess(myObject); 

class 3rPartyClss { 
    public void doProcess(final SomeClass myObject){} 
} 

如果第三方知道他不打算改變方法內的對象引用,那麼最後的簽名有什麼用?在重寫方法中,它也不會考慮最終的限定符。那麼它的真正用途是什麼?

我發現類似的問題,這樣的here,但想在這個

回答

3

進一步澄清在上面的代碼,爲什麼不考慮最後的預選賽,而覆蓋的方法?

因爲它是一個實現細節。與呼叫者完全無關。所有這一切意味着在該方法中,代碼無法爲該參數分配新值。即使可以,呼叫者也不會看到新的價值。 (這也意味着它可以在方法內的匿名方法中使用,但這是一種副作用。)

對於重載和重寫很重要的方法的唯一方面是那些重要的方法調用者 - 參數類型,可訪問性和方法名稱。 (返回類型對於重寫而言是重要的,但不能重載;方法是靜態還是不以不同方式影響不同的事情。)參數是否爲最終與方法是否同步無關。

與這樣的最終參數的任何方法:

public void foo(final String x) { 
    ... 
} 

可以簡單地改寫爲:

public void foo(String x) { 
    final String y = x; 
    // Code using y instead of x 
} 
+0

O_O那是快...在我花了時間來閱讀這一切後通過鏈接的問題 – awksp

+0

想知道爲什麼它在界面中是合法的(同步不是)... – assylias

+0

@assylias:是的,這是離奇的。 –

相關問題