Java方法变量中的final
今天由于对方法变量中的final有点困惑,在网上查了一下,才发现在方法变量中,final是这么一回事,这里做一下记录!
什么时候方法参数才需要加final关键字?
- 匿名/局部内部类访问外部方法参数时,外部参数需要加上final关键字。
用代码来解析:
public void start(int interval, final boolean beep) {/*** 局部内部类*/class TimePrinter implements ActionListener {public void actionPerformed(ActionEvent event) {Date now = new Date();System.out.println("At the tone, the time is " + now);// 访问外部方法参数beep beep前需加final关键字if (beep) Toolkit.getDefaultToolkit().beep();}}ActionListener listener = new TimePrinter();Timer t = new Timer(interval, listener);t.start();
}
看看反编译代码:
class TalkingClock$1TimePrinter {TalkingClock$1TimePrinter(TalkingClock, boolean);public void actionPerformed(java.awt.event.ActionEvent);final boolean val$beep;final TalkingClock this$0;
}
反编译的结果表明:
- 外部方法参数beep成了局部内部类TimePrinter的成员变量val$beep,而且修饰类型也是final
而且
- 局部内部类TimePrinter的成员变量val$beep的值是外部方法参数beep的拷贝,并非外部方法参数beep本身
为什么要final呢?
如果我们在局部内部类中对访问的这个局部变量进行了修改,例如在上面的actionPerformed方法中,而且beep不是final类型,添加了这样的一行代码:
public void actionPerformed(ActionEvent event) {beep = false;Date now = new Date();System.out.println("At the tone, the time is " + now);if (beep) Toolkit.getDefaultToolkit().beep();
}
这样的话就会出现矛盾,在actionPerformed中将beep置为false,这个beep本质上是我们前面提到的var$beep,而不是外部方法参数beep,那么接下来的代码中,到底以谁为准,就会造成不一致,就会给程序员带来困扰,那么这个时候规定,此时只能使用这个局部变量,而不允许修改它,因此,外部方法参数必须声明为final,而且内部类中的这份拷贝,这个成员变量也是final的。
有意思!!
感谢
深入理解final在Java和Android中修饰局部变量的意义
Java方法变量中的final相关推荐
- JAVA方法调用中的解析与分派
JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...
- java值传递和引用传递_辨析Java方法参数中的值传递和引用传递
小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...
- Java中什么时候throws_何时在Java方法声明中使用throws?
问题 所以我认为我对Java中的异常处理有一个很好的基本理解,但我最近阅读的一些代码让我有些困惑和怀疑.我想在这里解决的主要疑问是,一个人何时应该使用Java方法声明,如下所示: public voi ...
- java 方法 变量_Java-变量和方法
变量 成员变量和局部变量 1.成员变量 在类中定义,用来描述对象将要有什么. 2.局部变量 在类的方法中定义,在方法中临时保存数据. 作用域不同 局部变量的作用域仅限于定义它的方法 成员变量的作用域在 ...
- java方法中与参数怎么调用_与Java方法调用中的类型参数有关的问题
Java 8的Java语言规范在"示例4.11-1.类型的用法"中提供了一个带有类型实参的方法调用示例: void loop(S s) { this.loop(s); // is ...
- java 方法 void_Java中void方法的详解
详细内容 void方法是Java中一个不可实例化的占位符,当方法用void来修饰时表示没有返回值.它有两个作用分别为对函数参数的限定以及对函数返回值的限定 学习过Java的人都知道,在Java中voi ...
- Java 静态变量中包含变量,修改变量静态变量无法改变问题
先描述下问题场景:接口地址中父类地址为可变地址,修改父类地址后发现接口地址未曾改变.: public class Init {private static String baseUrl = " ...
- java环境变量中classpath是必须配置吗
- java val变量声明_Kotlin 中 var 与 val 定义变量的区别,及使用场景
看 Kotlin 项目示例代码中,经常出现 var / val 定义变量的情况.于是查了一下两者的区别: var 定义的变量可以被再次赋值.var 是 variable 的缩写. val 定义的变量不 ...
- JAVA方法中的参数用final来修饰的效果
很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,我们需要注意的是,在final修饰的方法参数中,如果修饰的是基本类型,那 ...
最新文章
- php生成pdf乱码_php+tcpdf生成pdf: 中文乱码
- [基础知识]Linux新手系列之三
- 面试题 16.11. 跳水板
- linux 卸载lv,Linux 软件安装、卸载、查询
- SQL Server维护计划–好处,功能和特性
- python数据可视化基础
- 多线程编译linux,linux下多线程下载工具axel的编译安装
- 刚注册博客了,发发随笔
- ubuntu 安装log4cpp
- 终极算法 机器学习和人工智能如何重塑世界
- C10K问题及解决方案
- Mathtype启动失败与Microsoft公式编辑器Equation的问题处理案例
- 驱动板LVDS输出接口(发送器),液晶面板LVDS输入接口(接收器)
- 厦门大学计算机2018专业分数线,2018厦门大学录取分数线,2018厦门大学各专业录取分数线...
- java里equal与equals_Java中关于==与equal和equals的区别
- 【重磅】DeepMind开源史上最全强化学习框架OpenSpiel(附安装方法)
- python-docx文档高亮显示
- 【GraphQL】---GraphQL的基本使用
- Sentence-Transformer的使用及fine-tune教程
- 系统学习机器学习之随机场(三)--MRF,CRF及几种模型对比
热门文章
- 遥感原理与应用总结——第三章:遥感传感器及成像原理
- 项目文档说明前端部分怎么写?写进readme.md文件里面。
- GET和POST的区别?
- 蔡勒公式与Python
- 大众点评美食评论爬虫
- 淘宝 京东 拼多多 唯品会返利 公众号开发
- 简约却不简单的科学原理闲谈(A Talk:Principles with simplicity but complicacy)
- nginx跨域配置、使用,docker部署nginx全流程(实测简单完整无坑)
- 怎么用python下载网易云_如何使用python批量下载网易云音乐的免费音乐
- android 智能手机usb驱动程序,华为手机usb驱动下载