一、使用目的
final根据上下文环境,通常被指为“这是无法改变的”。
- 需要一个永不改变的编译时常量
- 一个在运行时期被初始化的值,但是不希望被改变
二、使用场景
final可以用来修饰变量、方法、类。
1.final变量
- 用final修饰的变量,值一旦给定就无法改变
- 用final修饰的对象引用,使其对象引用 恒定不变,但是对象自身的内容可以被改变
“空白final”,指声明为final但未赋初值的域。但是在使用空白final之前必须被初始化,一般使用构造方法 进行初始化,这样就可以使一个类中的final域根据对象不同而有所不同。
public class FinalTest { private final int i=0; final int j;//空白final final Inner inner=new Inner();//修饰对象引用 public FinalTest(){ j=1;//在使用前进行初始化 }; public FinalTest(int x){ j=x;//在使用前进行初始化 } public static void main(String args[]){ FinalTest finalTest=new FinalTest(2);//空白final的赋值 // finalTest.i=1; 不可改变final的值 // finalTest.inner=new Inner();不能改变对象的引用 finalTest.inner.a=2;//可以改变对象内部的值 // finalTest.j=3;不可改变 } } class Inner{ int a=1; }
2.final方法
把方法锁定,以防任何继承类修改,不会被覆盖
private方法都隐式的被指定为final的。由于private无法被取用,也就无法覆盖。对应private方法,基类和继承类中可以同时出现相同名称的方法,但不能称之为覆盖,而是又创建了一个新类。对应final方法,则不可能出现这种同名情况
3.final参数
- 只能被使用,不能被修改
4.final类
- final类不能被继承,其成员方法都默认是final的
三、static和final一起使用
对于static和final修饰的域,只是占据了一段不能改变的存储空间
- 对于常量,表示一旦赋值就不可修改,并且通过类名可以访问,可理解为“全局常量”
- 对于方法,表示不可覆盖,并且可以通过类名可以访问
static final修饰的对象引用类和容器类(ArrayList、Map等),可以改变内容中存放的内容
参考:http://lavasoft.blog.51cto.com/62575/18771/ 和《Java编程思想》