我是Java新手,用Delphi和C#编程已经有一段时间了。我的问题涉及到当变量声明和实例化都发生在同一个方法的作用域内时,在保存实例化类的变量上使用"final“关键字。例如:
private String getDeviceID() {
//get the android device id
final TelephonyManager tm =
(TelephonyManager)GetBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final String deviceID = tm.getDeviceId();
// log debug message containing device ID
Log.d(LOG_CAT, "getDeviceID: " + deviceID);
return deviceID;
}好的,我想我得到了一个事实,"final“变量只能赋值一次,并且不能因为每个声明中的"final”关键字而改变,但是当方法退出时,这两个变量不是都超出了作用域吗?再次调用该方法将简单地重新分配2个新的最终变量,这些变量在方法退出时再次超出作用域?
对我来说,在这些变量上使用"final“关键字似乎有点奇怪?除非我不理解它们如何影响方法作用域中的局部变量?
有人能告诉我关于方法作用域," final“的影响是什么吗?或者说,将这些特定的变量声明为final只是某人做的一件愚蠢的事情?
发布于 2011-12-30 11:01:13
final对作用域没有影响。
它只是防止变量被重新赋值。
它对其他开发人员来说是一个信号,这些变量永远不会改变,并且它可以防止您意外地更改它们。
这在较长的方法中特别有用。
为了在匿名内部类中使用变量,final也是必需的,因为Java不支持真正的闭包。
发布于 2011-12-30 11:03:02
只要GC在方法退出时运行,这些变量就会被垃圾回收。
final关键字实际上是一个提示:这个变量只实例化一次,不应该在方法本身的主体中接触它。类似地,声明方法参数final禁止重用它们( imho,这是一件好事)。
但是请注意,关键字只影响对象引用:这并不意味着此对象引用上修改其内部状态的方法将停止工作(典型示例: setters)。
另一个注意事项:如果省略了final关键字,并且没有修改方法体中的变量,那么JVM就足够智能来优化这种情况。因此,您可以省略它。您是否使用它,以及在哪里使用它,这是一个品味/编码风格的问题。
最后,将public static变量声明为最终变量是一个很好的实践:否则,任何东西都可以修改它!考虑字符串常量等。
发布于 2011-12-30 11:07:09
final局部变量或参数的作用域没有什么特殊之处。
将局部变量或参数声明为final实际上并没有多大作用,也很少需要这样做。基本上有两个原因:
final都有点过头了。final。这是Java语言中的kluge;它的目的是防止内部类中的代码在变量或参数不再有效后试图修改它们。https://stackoverflow.com/questions/8675726
复制相似问题