关于Java中的局部最终变量

关于Java中的局部最终变量,java,final,inner-classes,Java,Final,Inner Classes,在java程序中,在方法声明中定义为String的参数。但在方法定义中,它作为最终字符串变量访问。是否会导致一些问题(如安全性、内存问题) 例如: 方法声明 join(String a,String b); public void join(final String a,final String b) { Authenticator au = new Authenticator(){ public PasswordAuthentication getPasswordAu

在java程序中,在方法声明中定义为
String
的参数。但在方法定义中,它作为
最终字符串
变量访问。是否会导致一些问题(如安全性、内存问题)

例如:

方法声明

join(String a,String b);
public void join(final String a,final String b)
{
    Authenticator au = new Authenticator(){
        public PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(a,b)}
    };
}
方法定义

join(String a,String b);
public void join(final String a,final String b)
{
    Authenticator au = new Authenticator(){
        public PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(a,b)}
    };
}
请帮我澄清我的疑问。提前谢谢


另外,我正在访问a和b作为最终变量,因为我必须在内部类中使用它。

final
只是意味着不能为引用/基本变量分配新值。它不同于
const
概念(Java没有);它不能保证不变性<当然,Java中的code>String已经足够不可变了(除非是恶劣的反射攻击)

对参数参数使用
final
修饰符对安全性或垃圾收集没有影响。这样做是为了可读性和强制执行编码约定,即在方法中不重用参数变量来存储其他值

当遇到
最终
修饰符时,人类读者可以确信,该变量的值一旦赋值,将不会在其范围内发生变化。编译器将强制执行此行为,并且不会编译非法尝试为声明为
final
的变量分配新值的程序

变量可以声明为
final
final
变量只能分配一次。如果将
final
变量赋值给,则这是一个编译时错误,除非在赋值之前明确未赋值

然而,如上所述,
final
本身并不能保证所引用对象的不变性。
最终StringBuilder sb
声明保证
sb
一旦分配并在其范围内,将不会引用另一个
StringBuilder
实例<代码>StringBuilder本身当然是一个可变对象


final
和内部类
final
修饰符的另一个用法是允许内部类使用局部变量等:

在内部类中使用但未声明的任何局部变量、形式方法参数或异常处理程序参数必须声明为
final

这与使用这些变量的内部类如何在Java中编译有关,这一实现细节可能与讨论不太相关。本质上,这些
final
变量的值是在构建时提供给内部类的。内部类实例将看不到对局部变量(如果允许)的后续更改。为了确保正确的语义,这些局部变量因此必须声明为
final


运行时局部变量的
final
修饰符的效果 局部变量/形式方法参数的
final
修饰符是一个编译时概念,不存在于字节码级别(即,它与字段、类和方法的
final
修饰符的作用非常不同)。因此,这个概念在运行时根本不存在,因为
final
和非
final
局部变量是不可区分的;关键字本身的使用不会对垃圾回收性和/或性能产生任何影响

垃圾回收性是根据对象是否存在活动引用来定义的。局部变量和方法参数在方法末尾(或声明它们的块)超出范围,无论它们是否声明为
final
。超出范围意味着引用是“死的”。对象本身可能仍然有来自其他地方的实时引用

在这种特殊情况下,形式化方法参数被声明为
final
,以便它们可以在内部类中使用。如上所述,内部类将复制这些引用以供自己使用。因此,在这种特定情况下,
验证器
对象将引用由
a
b
引用的
字符串
对象

简单地说,对一个对象的引用越多,就越难将其定义为无法识别的垃圾收集。然而,潜在的因素是这些引用的活跃性,而不是它们是否是
final


论仿形
最好理解这些概念,以消除对内存使用/性能问题的任何疑问;最好只是分析一下问题,看看问题是否真实,并在必要时加以解决。一个设计良好的系统应该能够很好地适应这些变化。

不,参数上的
final
只影响方法堆栈框架上参数的本地副本。它不会以任何方式影响或更改作为参数传递的值。

添加
final
不会更改签名或产生任何其他问题。因此,可以在接口指定的方法中使用(例如)。在方法内部编写代码只会有所不同

使变量成为最终变量与安全性或内存分配无关。它对安全性或内存使用没有任何影响。

为什么会标记为“outofmemoryerror”?你有内存错误吗?请详述你的问题,它有点难理解。@Satish:你能澄清你的疑问吗?我想确保我已经解决了所有的问题。@Satish:另外,为了确保您知道Java是按值传递的,而没有按引用传递的,对吗@Polygene:在方法定义中,我被迫使用这个变量作为最终变量。所以我担心它是否会导致一些运行时问题和性能问题。我是java新手。当变量被声明为final时