一、final作用
关于final关键字,我们很轻易的得到总结:
1.final修饰的类无法被继承
2.final修饰的方法无法被重写
3.final修饰的变量无法被修改
前面两条很容易理解,我们主要来看看final修饰的变量。
二、final变量
final修饰的变量从两方面来看,一是修饰基本数据类型(long,int。。。),一是修饰引用类型(String,数组,对象)。
eg1.final修饰基本数据类型
1 public class FinalCase { 2 private int normalValue; 3 private final int FINAL_NUM = 10; 4 private static final int STATIC_FINAL_NUM = 20; 5 private static Random random = new Random(1); 6 private final int FINAL_RANDOM_NUM = random.nextInt(10); 7 private static final int STATIC_FINAL_RANDOM_NUM = random.nextInt(10); 8 9 10 public static void change(){ 11 FinalCase finalCase = new FinalCase(); 12 finalCase.normalValue = 11; 13 //finalCase.FINAL_NUM = 11; 报错:无法修改final变量的值 14 //finalCase.STATIC_FINAL_NUM = 21; 报错:无法修改final变量的值 15 16 System.out.println("finalCase:normalValue="+finalCase.normalValue+",FINAL_NUM="+finalCase.FINAL_NUM+",STATIC_FINAL_NUM="+finalCase.STATIC_FINAL_NUM+",FINAL_RANDOM_NUM="+finalCase.FINAL_RANDOM_NUM+",STATIC_FINAL_RANDOM_NUM="+finalCase.STATIC_FINAL_RANDOM_NUM); 17 18 FinalCase finalCase2 = new FinalCase(); 19 finalCase2.normalValue = 11; 20 System.out.println("finalCase2:normalValue="+finalCase2.normalValue+",FINAL_NUM="+finalCase2.FINAL_NUM+",STATIC_FINAL_NUM="+finalCase2.STATIC_FINAL_NUM+",FINAL_RANDOM_NUM="+finalCase2.FINAL_RANDOM_NUM+",STATIC_FINAL_RANDOM_NUM="+finalCase2.STATIC_FINAL_RANDOM_NUM); 21 } 22 23 }
运行结果:
finalCase:normalValue=11,FINAL_NUM=10,STATIC_FINAL_NUM=20,FINAL_RANDOM_NUM=8,STATIC_FINAL_RANDOM_NUM=5
finalCase2:normalValue=11,FINAL_NUM=10,STATIC_FINAL_NUM=20,FINAL_RANDOM_NUM=7,STATIC_FINAL_RANDOM_NUM=5
可以看到FINAL_NUM和STATIC_FINAL_NUM是final修饰的常量,值不可以改变。通过FINAL_RANDOM_NUM和STATIC_FINAL_RANDOM_NUM这两个变量我们能看出staic修饰的变量在类装载的时候就初始化了值,不会再被初始化,所以finalCase和finalCase2的STATIC_FINAL_RANDOM_NUM的值是相同的。
eg2:final修饰引用类型
1 public class Car { 2 private int num; 3 4 public Car(int i) { 5 this.num = i; 6 } 7 8 public int getNum() { 9 return num; 10 } 11 12 public void setNum(int i) { 13 this.num = i; 14 } 15 }
1 public class FinalObject { 2 private String name ; 3 private static Car newCar = new Car(5); 4 private final Car car = newCar; 5 6 public void change(){ 7 FinalObject finalObject1 = new FinalObject(); 8 finalObject1.name ="yannic"; 9 //finalObject1.car = new Car(3); 报错:不能将final变量指向另一个对象。 10 System.out.println("newCar.num="+newCar.getNum()); 11 finalObject1.car.setNum(2); 12 System.out.println("finalObject1:name="+finalObject1.name+",car.num="+finalObject1.car.getNum()+",newCar.num="+newCar.getNum()); 13 newCar.setNum(4); 14 System.out.println("car.num="+finalObject1.car.getNum()+",newCar.num="+newCar.getNum()); 15 }
运行结果:
newCar.num=5
finalObject1:name=yannic,car.num=2,newCar.num=2
car.num=4,newCar.num=4
从上面的例子可以看出,car可以改变其值,不可以改变其引用。
总结:
对于基本数据类型,final使其数值基本不变。对于对象引用,final使其引用不变。一旦引用被初始化指向某一个对象,就无法改变指向另一个对象,但是对象本身是可以被改变的。