码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 多线程学习笔记-2.final关键字和不变性


    文章目录

      • 1. 什么是不变性
      • 2. final的作用
      • 3. 3种用途:修饰变量、方法、类
        • 3.1 修饰变量
          • 1. 类中的final变量属性
          • 2. 类中的staic final属性
          • 方法中的final变量
        • 3.2 修饰方法
        • 3.3 修饰类
      • 4. 注意点
      • 5. 不变性和final的关系
        • 5.1 如何确保类不可变
        • 5.2 栈封闭
      • 6. 常见面试题

    1. 什么是不变性

    在这里插入图片描述

    • 不可变的对象,演示其他类无法修改这个对象,public也不行
    • 案例演示
      在这里插入图片描述

    2. final的作用

    在这里插入图片描述

    3. 3种用途:修饰变量、方法、类

    3.1 修饰变量

    在这里插入图片描述

    public class Person {
        final int age = 18;
        final String name = alice;
        String bag = "computer";
        public static void main(String[] args) {
            final Person person = new Person();
        	person.bag = "book";   // 可以修改类的内容
    //      person = new Person(); // 不能重新引用
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    在这里插入图片描述

    1. 类中的final变量属性

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2. 类中的staic final属性

    在这里插入图片描述

    /**
     * 描述:     演示final变量
     */
    public class FinalVariableDemo {
    	// 1.可以直接赋值
        private static final int a;
    	// 2.或是在静态代码块中赋值
    //    static { 
    //        a = 7;
    //    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    方法中的final变量

    在这里插入图片描述

    /**
     * 描述:     演示final变量
     */
    public class FinalVariableDemo {
    //    void testFinal() {
    //       final int b = 7;
    //       int c = b;// 确保b使用时,是有赋值的
    //    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.2 修饰方法

    在这里插入图片描述
    在这里插入图片描述

    • 子类理论上是可以定义与父类相同的静态方法,但是属于各自类,没有继承关系

    3.3 修饰类

    在这里插入图片描述

    4. 注意点

    在这里插入图片描述

    5. 不变性和final的关系

    5.1 如何确保类不可变

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    5.2 栈封闭

    在这里插入图片描述

    package immutable;
    
    /**
     * 描述:     演示栈封闭的两种情况,基本变量和对象 先演示线程争抢带来错误结果,然后把变量放到方法内,情况就变了
     */
    public class StackConfinement implements Runnable {
    
        int index = 0;
    
        public void inThread() {
            // 方法内的变量,不共享,是安全的
            int neverGoOut = 0;
    //        synchronized (this) {
                for (int i = 0; i < 10000; i++) {
                    neverGoOut++;
                }
    //        }
    
            System.out.println("栈内保护的数字是线程安全的:" + neverGoOut);
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 10000; i++) {
                index++;
            }
            inThread();
        }
    
        public static void main(String[] args) throws InterruptedException {
            StackConfinement r1 = new StackConfinement();
            Thread thread1 = new Thread(r1);
            Thread thread2 = new Thread(r1);
            thread1.start();
            thread2.start();
            thread1.join();
            thread2.join();
            System.out.println(r1.index);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

    6. 常见面试题

    在这里插入图片描述
    示例1:
    在这里插入图片描述

    • 因b被final修饰,故,是不变的常量,编译期就确定的,这样,c能发现b,直接计算出字符串值wukong2,发现常量池中有,就直接指向a指向的常量,因此,地址一样
    • 但,d不同,在编译器无法识别,只有在运行时确定,e会在运行时在堆上创建一个指向wokong2的引用,因此,地址不同
      示例2:
      在这里插入图片描述
    • 获取方法的值,编译器不会做优化,只有在运行期才能拿到
  • 相关阅读:
    神经网络算法有哪些模型,神经网络模型数据处理
    基于微信小程序的图书馆选座系统源码
    SIGIR 2022 | 港大等提出超图对比学习在推荐系统中的应用
    2.PyQT6程序入门实例
    Unity 3D视频教程
    Linux入门篇——01(概述、安装、Linux文件与目录、Vim)
    图像处理之图像复原[逆滤波、维纳滤波、约束最小二乘法、Lucy-Richardson和盲解卷积复原]
    React——基础2(笔记)
    2022 9.6 模拟
    网页翻译插件本地文档批量翻译和内容批量编辑
  • 原文地址:https://blog.csdn.net/xingzhes_/article/details/126011797
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号