方法签名中的最终关键字

可能重复:
接口方法中的最终参数 – 重点是什么?

在尝试尝试一些事情时,我遇到了一个问题,就在本页中描述了这个问题。

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++ } } 

为什么这样的function可能? 我不知道为什么可以通过覆盖方法将最终参数变成非最终参数。 为什么在方法签名中忽略final关键字? 如何强制子类在其方法中使用最终变量?

Java通过值将参数传递给方法。

因此,参数的任何更改都不能传播回调用方。 因此,参数是否被声明为final对于调用者来说绝对没有区别。 因此,它是方法实现的一部分,而不是其接口的一部分。

你想要“强迫子类在他们的方法中使用最终变量”的动机是什么?

参数的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); } 

这将无法编译,因为编译器要求val为final。 所以将方法签名更改为

 void myMethod(final int val) 

将解决问题。 本地最终变量也会这样做:

 void myMethod(int val) { final int val0; // now use val0 in the anonymous class 

Java的final不是C ++ const ; 在Java中没有const-correctness这样的东西。

在Java中,使用不可变类来实现常量。 事实certificate它非常有效,因为与C ++不同,人们不能简单地弄乱内存。 (您可以使用Field.setAccessible(true) ,然后使用Reflection。但是,通过使用适当配置的安全管理器运行JVM,可以防止损坏向量。)

参数的final关键字不是方法签名的一部分,并且仅对方法主体很重要,因为Java按值传递所有参数(值的副本始终用于方法调用)。

如果编译器强制我使其成为final,我只使用final关键字(用于参数),因为该参数在方法中定义的匿名类中使用。

在Java中,参数按值传递。 参数是最终的还是不影响该方法,而不影响调用者。 我不明白为什么一个类需要强制子类型。

请注意, final参数有一个主要目的:您无法为它们分配新值。

另请注意,参数始终按值传递,因此调用者不会在方法内看到对参数的任何赋值。

如果你真的想强制参数是最终的(为了防止在意外重新分配参数时可能引入的错误)​​,请使用代码分析器,例如checkstyle。