为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?
为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?
public class Ace {
public static void main(String[] args) throws Exception {
go1();
go2(); // 这个编译不能通过,运行不了,详情看下面的说明
}
static void go1() {
final int n = 5;
new Ace() {
void go() {
test(n); // 并不会改变 n 的值
}
void test(int n) {
n = 10;
}
}.go();
System.out.println(n); // 输出 5
}
static void go2() {
int n = 5;
new Ace() {
void go() {
n = 10;
// 这里我们假设不需要 final 修饰,假设这么写不报错
// (实际是报错了,Java8 可以不 final 修饰,但这么写也会报错)
}
}.go();
System.out.println(n); // 如果上面不报错的话,这里是不是应该输出 10 呢?答案是不会。
// 但是,这么写,会让人很自然的以为 n 的值已经变成 10 了。
// 而实际上,n 的值在内部类中变化,在外面是不会变的
// 为了让玩家避免犯“很自然”的错误,干脆强制要 final 修饰得了
// (让你在内部类中不能改变它,也就不会有上面很自然的错误了)
// (Java8 中不需要 final 修饰,但是在内部类中改变时会报错,等于是在进入内部类后,默认 final 修饰了)
}
}
再也不想纠结这个问题了!
为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?的更多相关文章
- final修饰符(6)-final类
final修饰的类不可以有子类,例如:java.lang.Math类就是一个final类,它不可以有子类 子类继承父类,可以访问父类的内部数据,可以重写父类的方法来改变父类方法的实现细节,可能导致不安 ...
- final修饰符(5)-final方法
final修饰的类的方法不能被重写,例如如果父类不希望子类重写某个方法,则可以使用final修饰符修饰该方法 在java的Object类里面有一个final方法:getClass(),因为Java不希 ...
- 内部类访问局部变量的时候,为什么变量必须加上final修饰
这里的局部变量就是在类方法中的变量,能访问方法中变量的类当然也是局部内部类了.我们都知道,局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的.例如下面的代码: cl ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- Java final 修饰符知识点总结
final从字面上理解含义为“最后的,最终的”.在Java中也同样表示出此种含义. final可以用来修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. 1. fin ...
- Java内部类引用外部类中的局部变量为何必须是final问题解析
今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方 ...
- 为什么局部内部类中访问同一方法中的变量,该变量一定要是final修饰的
最近有一个疑惑:为什么局部内部类中访问同一方法中的变量,该变量一定要是final修饰的 首先,我们看一个局部内部类的例子: class OutClass { ...
- 12. final修饰符
一.final修饰符概述 1. final可以修饰类.变量和方法 2. final修饰的类.变量和方法不可改变 3. 不允许为final变量重新赋值,子类不允许覆盖父类的final方法,final类不 ...
- as3 中 final 修饰符
现在,在ActionScript 3.0的修饰符中,只有final修饰符没有介绍.之所有放在这里介绍,是因为final修饰符只与继承有关,指定一个方法不能被重写或一个类不能被继承. 一般来说,当用fi ...
随机推荐
- pc端,移动端css重置样式
pc: html{font-family:"Microsoft YaHei UI","Microsoft YaHei",sans-serif;-ms-text- ...
- 《尚学堂_史上最易懂的设计模式视频》--章节3 Iterator迭代 模拟列表
广州尚学堂官网-|广州Java培训|Java培训机构|人工智能+Python培训|PHP培训|全栈工程师培训|UI设计培训|前端移动开发培训http://www.gzsxt.cn/ ==Iterato ...
- java -jar参数携带问题
方式一 -DpropName=propValue的形式携带,要放在-jar参数前面,亲测,放在它后面好像取不到值 java -fileName=JOURNAL_TREENODE_DATA-201904 ...
- pyhton之Reportlab模块
reportlab模块是用python语言生成pdf文件的模块 安装:pip install reportlab 模块默认不支持中文,如果使用中文需要注册 1.注册中文字体 下载自己需要的.ttf字体 ...
- JDBC连接MariaDB:数据传输加密
环境:win7+springboot+mybatis+mariadb 需求说明: 未做安全加固前用wireshark抓包: 可以很明显看到用户名.数据库和 SQL,这种情况是有安全风险的. 1.下载o ...
- sublime的Vue语法高亮插件安装
1.准备语法高亮插件vue-syntax-highlight. 下载地址: https://github.com/vuejs/vue-syntax-highlight 下载页面并下载: 解开压缩包vu ...
- element el-tree 添加图标
1.指定渲染函数:render-content="renderContent" <el-tree ref="tree" :data="funct ...
- 叩响C#之门-继承
就记录下一些概念,以供备忘. 一生二,二生三,三生万物.类类相生,生生不息. 重写和重载的区别: 重载是指同一个类中相同名称但参数不同的方法. 重写是指继承关系中,在派生类中重写由基类继承来的方法 ...
- 关闭 Visual Studio 的 Browser Link 功能
最近公司弄新项目需要用 MVC,就把 IDE 升级到了 Visual Studio 2013,在开发的时候发现有好多请求一个本地49925的端口 . 很奇怪,一开始以为是 Visual Studio ...
- Python 实现 动态规划 /斐波那契数列
1.斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数 ...