首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和Final关键字的使用

Java和Final关键字的使用
EN

Stack Overflow用户
提问于 2011-12-30 10:58:33
回答 8查看 1.5K关注 0票数 4

我是Java新手,用Delphi和C#编程已经有一段时间了。我的问题涉及到当变量声明和实例化都发生在同一个方法的作用域内时,在保存实例化类的变量上使用"final“关键字。例如:

代码语言:javascript
复制
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只是某人做的一件愚蠢的事情?

EN

回答 8

Stack Overflow用户

发布于 2011-12-30 11:01:13

final对作用域没有影响。

它只是防止变量被重新赋值。

它对其他开发人员来说是一个信号,这些变量永远不会改变,并且它可以防止您意外地更改它们。

这在较长的方法中特别有用。

为了在匿名内部类中使用变量,final也是必需的,因为Java不支持真正的闭包。

票数 6
EN

Stack Overflow用户

发布于 2011-12-30 11:03:02

只要GC在方法退出时运行,这些变量就会被垃圾回收。

final关键字实际上是一个提示:这个变量只实例化一次,不应该在方法本身的主体中接触它。类似地,声明方法参数final禁止重用它们( imho,这是一件好事)。

但是请注意,关键字只影响对象引用:这并不意味着此对象引用上修改其内部状态的方法将停止工作(典型示例: setters)。

另一个注意事项:如果省略了final关键字,并且没有修改方法体中的变量,那么JVM就足够智能来优化这种情况。因此,您可以省略它。您是否使用它,以及在哪里使用它,这是一个品味/编码风格的问题。

最后,将public static变量声明为最终变量是一个很好的实践:否则,任何东西都可以修改它!考虑字符串常量等。

票数 5
EN

Stack Overflow用户

发布于 2011-12-30 11:07:09

final局部变量或参数的作用域没有什么特殊之处。

将局部变量或参数声明为final实际上并没有多大作用,也很少需要这样做。基本上有两个原因:

  1. 一些开发人员认为,任何不需要可变的东西都应该是不可变的。虽然我在原则上同意(不变性在许多方面都是一件好事),但我认为对于像Java这样的语言来说,声明所有的final都有点过头了。
  2. 如果你的方法包含一个本地或匿名内部类,并且你想让内部类中的代码可以访问它的任何局部变量或参数,那么你必须将它们声明为final。这是Java语言中的kluge;它的目的是防止内部类中的代码在变量或参数不再有效后试图修改它们。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8675726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档