final关键字

一、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使其引用不变。一旦引用被初始化指向某一个对象,就无法改变指向另一个对象,但是对象本身是可以被改变的。

posted @ 2019-03-13 22:05  东篱闲菊  阅读(197)  评论(0编辑  收藏  举报