函数中的方法签名覆盖参数中的最终限定符

时间:2014-05-17 07:38:37

标签: java oop override final

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这样的问题,但希望对此有更多的澄清

1 个答案:

答案 0 :(得分:3)

  

在上面的代码中,为什么在覆盖方法时不考虑最终限定符?

因为它是一个实现细节。它与呼叫者完全无关。这意味着在方法中,代码不能为该参数分配新值。即使可能,呼叫者也不会看到新的价值。 (这也意味着它也可以在方法中的匿名方法中使用,但这是一种副作用。)

对于重载和重写很重要的方法的唯一方面是对调用者很重要的方面 - 参数类型,可访问性和方法名称。 (返回类型对于重写但不重载很重要;方法是否静态会以不同方式影响不同的事物。)参数是否为final是与方法是否同步无关。

任何带有这样的最终参数的方法:

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

可以简单地重写为:

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