gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:23:25 25 4
gpt4 key购买 nike

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 限定符?

我对方法签名中的最终限定符的理解是,该方法不允许更改引用。但是我不明白它有什么用?

假设我正在使用第 3 方 jar,我担心第 3 方 jar 在处理时不应该更改我的对象,代码应该是这样的,

3rdPartyClass.doProcess((final) myObject);

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

但为什么喜欢

3rdPartyClass.doProcess(myObject);

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

如果第 3 方知道他不会更改方法内部的对象引用,那么在签名中使用 final 有什么用?在覆盖方法中,它也不会考虑最终限定符。那么它的真正用途是什么?

我发现类似这样的问题 here , 但希望对此有更多的澄清

最佳答案

In the above code, why it is not considering the final qualifier while overriding a method?

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

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

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

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

可以简单地重写为:

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

关于java - 函数中的方法签名用参数中的最终限定符覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23708845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com