zoukankan      html  css  js  c++  java
  • 浅谈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! ```

    参考资料:

  • 相关阅读:
    sky A800s手机恢复出厂设置操作
    SlimDx绘制点图元的问题
    自定义Token的CAS登录
    未来谁才是移动互联网的入口?
    [Oracle]Sqlplus连接成功,但pl/sql连接不成功,提示“ora-12145:无法解析指定的连接标识符”
    memcached分布式内存系统
    Android下结束进程的方法
    博客搬家啦~
    NOIp2013火柴排队
    NOIp2014 T2联合权值
  • 原文地址:https://www.cnblogs.com/hgnulb/p/10615875.html
Copyright © 2011-2022 走看看