今天由于对方法变量中的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相关推荐

  1. JAVA方法调用中的解析与分派

    JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...

  2. java值传递和引用传递_辨析Java方法参数中的值传递和引用传递

    小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...

  3. Java中什么时候throws_何时在Java方法声明中使用throws?

    问题 所以我认为我对Java中的异常处理有一个很好的基本理解,但我最近阅读的一些代码让我有些困惑和怀疑.我想在这里解决的主要疑问是,一个人何时应该使用Java方法声明,如下所示: public voi ...

  4. java 方法 变量_Java-变量和方法

    变量 成员变量和局部变量 1.成员变量 在类中定义,用来描述对象将要有什么. 2.局部变量 在类的方法中定义,在方法中临时保存数据. 作用域不同 局部变量的作用域仅限于定义它的方法 成员变量的作用域在 ...

  5. java方法中与参数怎么调用_与Java方法调用中的类型参数有关的问题

    Java 8的Java语言规范在"示例4.11-1.类型的用法"中提供了一个带有类型实参的方法调用示例: void loop(S s) { this.loop(s); // is ...

  6. java 方法 void_Java中void方法的详解

    详细内容 void方法是Java中一个不可实例化的占位符,当方法用void来修饰时表示没有返回值.它有两个作用分别为对函数参数的限定以及对函数返回值的限定 学习过Java的人都知道,在Java中voi ...

  7. Java 静态变量中包含变量,修改变量静态变量无法改变问题

    先描述下问题场景:接口地址中父类地址为可变地址,修改父类地址后发现接口地址未曾改变.: public class Init {private static String baseUrl = " ...

  8. java环境变量中classpath是必须配置吗

  9. java val变量声明_Kotlin 中 var 与 val 定义变量的区别,及使用场景

    看 Kotlin 项目示例代码中,经常出现 var / val 定义变量的情况.于是查了一下两者的区别: var 定义的变量可以被再次赋值.var 是 variable 的缩写. val 定义的变量不 ...

  10. JAVA方法中的参数用final来修饰的效果

    很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,我们需要注意的是,在final修饰的方法参数中,如果修饰的是基本类型,那 ...

最新文章

  1. php生成pdf乱码_php+tcpdf生成pdf: 中文乱码
  2. [基础知识]Linux新手系列之三
  3. 面试题 16.11. 跳水板
  4. linux 卸载lv,Linux 软件安装、卸载、查询
  5. SQL Server维护计划–好处,功能和特性
  6. python数据可视化基础
  7. 多线程编译linux,linux下多线程下载工具axel的编译安装
  8. 刚注册博客了,发发随笔
  9. ubuntu 安装log4cpp
  10. 终极算法 机器学习和人工智能如何重塑世界
  11. C10K问题及解决方案
  12. Mathtype启动失败与Microsoft公式编辑器Equation的问题处理案例
  13. 驱动板LVDS输出接口(发送器),液晶面板LVDS输入接口(接收器)
  14. 厦门大学计算机2018专业分数线,2018厦门大学录取分数线,2018厦门大学各专业录取分数线...
  15. java里equal与equals_Java中关于==与equal和equals的区别
  16. 【重磅】DeepMind开源史上最全强化学习框架OpenSpiel(附安装方法)
  17. python-docx文档高亮显示
  18. 【GraphQL】---GraphQL的基本使用
  19. Sentence-Transformer的使用及fine-tune教程
  20. 系统学习机器学习之随机场(三)--MRF,CRF及几种模型对比

热门文章

  1. 遥感原理与应用总结——第三章:遥感传感器及成像原理
  2. 项目文档说明前端部分怎么写?写进readme.md文件里面。
  3. GET和POST的区别?
  4. 蔡勒公式与Python
  5. 大众点评美食评论爬虫
  6. 淘宝 京东 拼多多 唯品会返利 公众号开发
  7. 简约却不简单的科学原理闲谈(A Talk:Principles with simplicity but complicacy)
  8. nginx跨域配置、使用,docker部署nginx全流程(实测简单完整无坑)
  9. 怎么用python下载网易云_如何使用python批量下载网易云音乐的免费音乐
  10. android 智能手机usb驱动程序,华为手机usb驱动下载