SHi*_*KiT 7 java final method-signature
可能重复:
接口方法中的最终参数 - 重点是什么?
在试图尝试一些事情时,我遇到了一个问题,就在本页中描述了这个问题.
interface B {
public int something(final int a);
}
abstract class C {
public int other(final int b);
}
class A extends C implements B {
public int something(int a) {
return a++;
}
public int other(int b) {
return b++
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这样的功能可能?我不知道为什么可以通过覆盖方法将最终参数变成非最终参数.为什么方法签名中忽略了final关键字?我如何强制子类在其方法中使用最终变量?
Java通过值将参数传递给方法.
因此,对参数的任何更改都不会传播回调用方.因此,无论声明参数是否final与调用者完全没有区别.因此,它是方法实现的一部分,而不是其接口的一部分.
你想要"强制子类在他们的方法中使用最终变量"的动机是什么?
最终变量是唯一可以在闭包中使用的变量.所以,如果你想做这样的事情:
void myMethod(int val) {
MyClass cls = new MyClass() {
@override
void doAction() {
callMethod(val); // use the val argument in the anonymous class - closure!
}
};
useClass(cls);
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为编译器需要val是最终的.所以将方法签名更改为
void myMethod(final int val)
Run Code Online (Sandbox Code Playgroud)
将解决问题.本地最终变量也会这样做:
void myMethod(int val) {
final int val0;
// now use val0 in the anonymous class
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8980 次 |
| 最近记录: |