• 浅谈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! ```

    参考资料:

  • 相关阅读:
    [Noip2016]天天爱跑步
    [ioi2008]Island 岛屿
    [Poi2012]Rendezvous
    RCTF2019 next_php
    WinSocket编程笔记(五)
    PTA的Python练习题(二十一)
    WinSocket编程笔记(四)
    PTA的Python练习题(二十)
    WinSocket编程笔记(三)
    WinSocket编程笔记(二)
  • 原文地址:https://www.cnblogs.com/hgnulb/p/10615875.html
Copyright © 2020-2023  润新知