final关键字

本文介绍了Java中final关键字的使用,它可修饰类、方法和成员变量,修饰类时不能被继承,修饰方法时不能被重写,修饰成员变量有不同情况。还提到在匿名内部类中使用变量的限制,JDK1.7和JDK1.8有所不同,以及加final限制的原因。

final可以修饰类,方法,成员变量。

1.修饰类时,说明该类不能被继承;

2.修饰方法时,说明该方法不能被重写;

3.修饰成员变量时,有两种情况:

  1>基本类型,代表数值永远不能变(不能被赋值)

  2>引用类型,该变量所的引用不能变,但引用所代表的对象内容是可变的!

注意:并不是被final修饰的成员变量就一定是编译期常量了

  比如:private final int java3y = new Random().nextInt(20);

在编写匿名内部类的时候就可能会出现这种情况,匿名内部类可能会使用到的变量:

  • 外部类实例变量

  • 方法或作用域内的局部变量

  • 方法的参数

 1 class Outer {
 2 
 3 
 4     // string:外部类的实例变量
 5     String string = "";
 6 
 7 
 8     //ch:方法的参数
 9     void outerTest(final char ch) {
10 
11         // integer:方法内局部变量
12         final Integer integer = 1;
13         new Inner() {
14             void innerTest() {
15                 System.out.println(string);
16                 System.out.println(ch);
17                 System.out.println(integer);
18             }
19         };
20 
21     }
22     public static void main(String[] args) {
23         new Outer().outerTest(' ');
24     }
25     class Inner {
26     }
27 }

 

其中我们可以看到:方法或作用域内的局部变量和方法参数都要显示使用final关键字来修饰(在jdk1.7下)!

如果切换到jdk1.8编译环境下,可以通过编译的~

下面我们首先来说一下显示声明为final的原因:为了保持内部外部数据一致性

  • Java只是实现了capture-by-value形式的闭包,也就是匿名函数内部会重新拷贝一份自由变量,然后函数外部和函数内部就有两份数据。

  • 要想实现内部外部数据一致性目的,只能要求两处变量不变。JDK8之前要求使用final修饰,JDK8聪明些了,可以使用effectively final的方式

为什么仅仅针对方法中的参数限制final,而访问外部类的属性就可以随意?

内部类中是保存着一个指向外部类实例的引用,内部类访问外部类的成员变量都是通过这个引用。

  • 在内部类修改了这个引用的数据,外部类获取时拿到的数据是一致的!

那当你在匿名内部类里面尝试改变外部基本类型的变量的值的时候,或者改变外部引用变量的指向的时候,表面上看起来好像都成功了,但实际上并不会影响到外部的变量。所以,Java为了不让自己看起来那么奇怪,才加了这个final的限制。

转载于:https://www.cnblogs.com/xc-chejj/p/10559745.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值