1、概述
最一般的意思就是声明 “这个东西不能改变”。之所以要禁止改变,可能是考虑到两方面的因素:设计或效率。 final 关键字可以用来修饰变量、方法和类,修饰变量表示变量不能被修改,修饰方法表示方法不能被重写,修饰类表示类不能被继承。
由于以下两个原因,数据的恒定不变是很有用的。
2、修饰变量
当对对象引用而不是对原始类型运用 final 时,其含义会有一点令人迷惑。对于原始类型,final 使数值恒定不变,而对于对象引用,final 使引用恒定不变。一旦引用被初始化指向一个对象,就无法对他改变以指向另一个对象。然而,对象其本身却是可以修改的,Java并未提供使任何对象恒定不变的途径。来个Demo 如下:
public class Value { int i=1; }
FinalData { final int i1 = 9; static int I2 = 99int I3 = 39int i4 = (int)(Math.random()*20);//特别注意 int i5 = (特别注意 Value v1 = new Value(); final Value v2 = final Value v3 = int[] a = { 1,2,3,4,5,6 }; void print(String id) { System.out.println(id + ": " + "i4 = " + i4 + ",i5 = " + i5); } main(String[] args) { FinalData fd1 = FinalData(); ! fd1.i1++; Error:final的值不能被改变 fd1.v2.i++; 对象的成员未被设成final,不会报错 fd1.v1 = new Value(); OK --不是final对象 for(int i = 0; i < fd1.a.length; i++) fd1.a[i]++; 对象的成员未被设成final,不会报错 fd1.v2 = new Value(); Error: Can't fd1.v3 = new Value(); 不能将一个final引用指向另一个 fd1.a = new int[3]; fd1.print("fd1"); System.out.println("Creating new FinalData"); FinalData fd2 = FinalData(); fd1.print("fd1"); fd2.print("fd2"); } }
不能由于某样东西的属性是 final,就认定它的值能在编译时期知道。 i4 和 i5 向大家证明了这一点。它们在运行期间使用随机生成的数字。例子的这一部分也向大家揭示出将 final 值设为 static 和非 static 之间的差异 。记住一点:static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。
请注意,带有恒定初始值(即编译期常量)的final static 原始类型全部用大写字母命名,并且字与字之间用下划线来隔开。一个既是 static 又是 final 的域只占一份不能改变的存储空间。
Java 强行要求我们对 final 进行赋值处理 —— 要么在定义字段时,要么在每个构建器中。这样就可以确保 final 字段在使用前获得正确的初始化。
3、修饰方法
4、修饰类
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。