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

  • 相关阅读:
    LeetCode0350.两个数组的交集 II
    LeetCode0055.跳跃游戏
    LeetCode0739.每日温度
    LeetCode面试题46.把数字翻译成字符串
    LeetCode0128.最长连续序列
    LeetCode面试题29.顺时针打印矩阵
    LeetCode0238.除自身以外数组的乘积
    2020软件工程最后一次作业
    如何防止XSS攻击
    需求规格说明书
  • 原文地址:https://www.cnblogs.com/ITyannic/p/10526974.html
Copyright © 2020-2023  润新知