2014-05-17 49 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:是的,这是离奇的。 –

相关问题