Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法签名中的Final关键字_Java_Final_Method Signature - Fatal编程技术网

Java 方法签名中的Final关键字

Java 方法签名中的Final关键字,java,final,method-signature,Java,Final,Method Signature,可能重复: 在尝试一些事情时,我遇到了一个问题,如中所述 为什么这样的功能是可能的?我不知道为什么可以通过重写方法将最终参数变成非最终参数。为什么在方法签名中忽略最后一个关键字?我如何强制子类在其方法中使用最终变量?Java通过值将参数传递给方法。 因此,对参数的任何更改都不能传播回调用方。因此,参数是否声明为final对调用者绝对没有影响。因此,它是方法实现的一部分,而不是其接口的一部分 您希望“强制子类在其方法最终变量中使用”的动机是什么?参数的final关键字不是方法签名的一部分,并且只

可能重复:

在尝试一些事情时,我遇到了一个问题,如中所述


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

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

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


您希望“强制子类在其方法最终变量中使用”的动机是什么?

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


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

final
对于参数,仅意味着不能在方法体中更改该值。这不是方法签名的一部分,与子类无关


在接口或抽象方法中使用最终参数应该是无效的,因为它没有意义。

在Java中,参数是按值传递的。参数是否为final仅影响该方法,而不影响调用方。我不明白为什么类需要限定子类型。

请注意,
final
参数有一个主要目的:您不能为它们指定新值

还要注意的是,参数总是按值传递,因此调用方在方法内部不会看到对参数的任何赋值


如果您真的想强制参数为最终(为了防止在参数重新分配时引入的错误),请使用代码类型分析程序,如CytSype。< P/> < P> java >代码>最终< /COD>不是C++ >代码> const < /C>Java中没有常量正确性这类东西


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

最终变量是闭包中唯一可以使用的变量。所以如果你想做这样的事情:

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
为最终版本。因此,将方法签名更改为

void myMethod(final int val)
这将解决问题。局部最终变量也可以:

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

对我来说,这的确很重要。我不希望在调用方方法中更改我的变量。它的原始值必须不惜一切代价予以保留;它是按值传递的,因此默认情况下受到保护。声明一个对象引用final并不能保护该对象的内容不被修改,它将被保留,因为Java总是在将值传递给方法之前复制它。如果该方法更改参数值,它将更改一个副本,调用方方法的值将始终不受影响,无论是否使用final。是的,我犯了错误。在处理了这么多对象之后,它传递了一个对象“指针”的副本,我完全忘记了基本变量和最终类,比如Integer。无论它是原始值还是最终类,我都不必担心,因为原始值将被保留。谢谢所有回答的人!“Java通过值将参数传递给方法。”这仅当它们是基元时。对象参数是按指针样式传递的,指针本身是按值传递的。因此,您可以对对象参数调用mutator方法(如果愿意,甚至可以使用反射),调用者将看到这些更改。调用方唯一看不到的是重新分配,因为您正在重新分配副本,而不是他的副本。
final
不是方法签名的一部分。子类的方法如何实现它与接口无关。我认为“非常有趣的事情”是指“反射”
foo.getClass().getDeclaredField(“bar”).setAccessible(true)
是您在一个不关心的VM上所需要的一切。仅当您没有启用安全管理器时。在我领导的团队中,我们总是根据具体情况安装安全管理器和白名单访问违规。与C++相比,在这里不可能防止(甚至检测)库从垃圾写入内存。你确实在一个不安全的虚拟机上说了话,因此没有安全管理器。我明白你的意思。编辑回答。“在接口或抽象方法中有最终参数应该是无效的,因为它是无意义的。”是的,它应该,是的,它是无意义的,但它不是无效的。:-)
void myMethod(int val) {
    final int val0;
    // now use val0 in the anonymous class