浅谈final修饰的变量

浅谈final修饰的变量

定义:
【以下摘自Java编程思想 第四版】

    根据上下文环境,Java的关键字final的含义存在着细微的区别,但通常它指的是“这是无法改变的”。不想做改变可能出于两种理由:设计或效率。由于这两个原因相差很远,所以关键字final有可能被误用。
    一个既是static又是final的域只占据一段不能改变的存储空间。
    当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑。对于基本类型,final使数值恒定不变;而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径(但可以自己编写类以取得使对象恒定不变的效果)。这一限制同样适用数组,它也是对象。

实例代码:

/**
 * Test class
 * 参考:https://blog.csdn.net/zhangjk1993/article/details/24196847
 *
 * @author libin
 * @date 2019/3/27 11:27
 */
public class Test {

    // 【成员变量】

    // 方法一:直接赋值
    final int a = 1;

    // 方法二:构造方法初始化
    final int b;

    public Test() {
        b = 2;
    }

    // 【会报错】如果采用构造方法初始化,以后每个构造方法中都要有 b 赋值的语句。
    /*public Test(String name){

    }*/

    // 为了方便可以这样写
    public Test(String name) {
        this();
    }

    // 【会报错】因为对 b 重复赋值
    /*public Test(String name,int age){
        this();
        b = 2;
    }*/

    // 方法三:声明完变量后在构造代码块中为其赋值
    final int c;

    {
        c = 3;
    }


    
    // 【静态变量(类变量)】

    // 方法一:直接赋值
    final static int d = 4;

    // 方法二:变量同时采用 static final 修饰时,不能再采用构造方法或者构造代码块赋值了,可以采用静态代码块或者直接赋值。
    final static int e;

    static {
        e = 5;
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.f1(6);
    }

    public void f1(int x) {
        // 局部变量,static 不能修饰局部变量。
        final int a;
        a = x;
        System.out.println("a:" + a);
        final int b = 7;
        System.out.println("b:" + b);
        final int c;
        c = 8;
        System.out.println("c:" + c);
    }
}

参考答案

``` a:6 b:7 c:8 ```

面试题:Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

/**
 * TestFinal class
 *
 * @author libin
 * @date 2019/3/28 16:48
 */
class People {
    private String name;
    private int age;

    People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ": " + age;
    }
}

public class TestFinal {
    public static void main(String[] args) {
        final People p1 = new People("张三", 21);
        System.out.println("p1: " + p1);
        p1.setAge(23);
        System.out.println("p1: " + p1);
        People p2 = new People("李四", 22);
        // p1 = p2; // Cannot assign a value to final variable 'p1'
        System.out.println("p2: " + p2);
        p2 = p1;
        System.out.println("p2: " + p2);

        System.out.println("----------------");
        final StringBuilder sb = new StringBuilder("Good ");
        sb.append("Morning!");
        System.out.println(sb.toString());
        // sb = new StringBuilder("Hello World!"); // Cannot assign a value to final variable 'sb'
    }
}

参考答案

``` p1: 张三: 21 p1: 张三: 23 p2: 李四: 22 p2: 张三: 23 ---------------- Good Morning! ```

参考资料:

原文地址:https://www.cnblogs.com/hgnulb/p/10615875.html