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
}
}
在上面的代码中,为什么在覆盖方法时不考虑 final 限定符?
我对方法签名中的最终限定符的理解是,该方法不允许更改引用。但我不明白它的用途是什么?
让我们说我使用第三方jar,我担心第三方jar在处理时不应该改变我的对象,代码应该是这样的,
3rdPartyClass.doProcess((final) myObject);
class 3rPartyClss {
public void doProcess(SomeClass myObject){}
}
但为何如此
3rdPartyClass.doProcess(myObject);
class 3rPartyClss {
public void doProcess(final SomeClass myObject){}
}
如果第三方知道他不打算更改方法中的对象引用,那么在签名中使用final有什么用?在重写方法中,它也不会考虑最终限定符。那么它的实际用途是什么?
我发现了类似here这样的问题,但希望对此有更多的澄清
答案 0 :(得分:3)
在上面的代码中,为什么在覆盖方法时不考虑最终限定符?
因为它是一个实现细节。它与呼叫者完全无关。这意味着在方法中,代码不能为该参数分配新值。即使可能,呼叫者也不会看到新的价值。 (这也意味着它也可以在方法中的匿名方法中使用,但这是一种副作用。)
对于重载和重写很重要的方法的唯一方面是对调用者很重要的方面 - 参数类型,可访问性和方法名称。 (返回类型对于重写但不重载很重要;方法是否静态会以不同方式影响不同的事物。)参数是否为final是与方法是否同步无关。
任何带有这样的最终参数的方法:
public void foo(final String x) {
...
}
可以简单地重写为:
public void foo(String x) {
final String y = x;
// Code using y instead of x
}