学习笔记分享-jvm-类加载-初始化、练习1、练习2

前言

  • 图片上面的personal表示只有图片上面的一行语句是解释图片内容的、local表示这个图片所在标题下的所有语句都是解释图片内容的、global表示有多个标题下的所有语句都是解释图片内容的
  • 我是一名大二的学生,学了差不多一年java技术栈了,想记录一下自己对知识点的心得,目前还是个小白,期望大佬们可以指出我笔记中的不足之处、对知识点的认知错误、笔记结构的混乱等
  • 这些图片内容都是在观看黑马课程时的视频截图

学习了 p147-p149(类加载-初始化、练习 1、练习 2)

1. 类加载-初始化

1.1 原子化解释

  • 本质: 从字节码角度看,只要涉及到调用()V指令的操作就会触发初始化;从 java 层面来看,只要跟静态代码块有关的操作就会触发初始化
  • 差异化锚点: 类加载-连接-准备阶段
  • 致命误区: 误认为所有的静态变量的赋值操作都在初始化阶段完成

1.2 会触发初始化的相关操作

  • main 方法所在类,总会被首先初始化
    • main 方法可以看成是当前类的一个静态方法,静态方法很有可能访问当前类中的某些需要初始化阶段完成赋值操作的静态变量,因而会初始化 main 方法所在类
  • 首次访问这个类的静态变量或静态方法时
    • 某些静态变量需要在初始化阶段才会进行赋值操作
  • 子类初始化,如果父类还没有初始化,会引发父类初始化
    • 子类初始化时有可能需要用到父类的静态变量
  • 通过子类访问父类的静态变量,只会触发父类的初始化
    • 这个要举例比较好理解,假设 A 是 B 的父类,A 类有一个 a 静态变量,B.a 可以访问到 A 的 a 变量,但是只会触发 A 的初始化,这时因为 java 层面的 B.a 在字节码层面实际上是 A.a
  • Class.forName
  • new 会导致初始化

1.3 不会引发初始化的操作

  • 访问类的 static finaly 静态常量(基本类型和 String 的字面量)不会触发初始化
    • 在类加载的连接准备阶段就完成了赋值
  • 类对象.class 不会触发初始化
    • 该操作只是获取类的 class 对象,类的 class 对象在类加载的加载阶段就已创建
  • 创建该类的数组不会触发初始化
  • 类加载器的 loadClass 方法不会触发初始化
  • Class.forName 的参数为 2 时也不会触发初始化
  • global
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2. 练习 1

  • 对于包装类型的静态常量,同样需要在初始化阶段才会进行复制操作,因为由基本类型到包装类型需要自动装箱,也就是创建对象的过程
  • personal
    在这里插入图片描述
    在这里插入图片描述

3. 练习 2

3.1 原子化解释

  • 本质: 利用触发初始化的条件来设计单例类(利用静态内部类设计单例)
  • 差异化锚点: 多种单例设计模式
  • 致命误区: 暂未发现

3.2 细节补充

  • 饿汉式实现单例的缺点就是如果访问其他静态变量也会触发单例的赋值操作
  • 双重检查的懒汉式实现单例弥补了饿汉式实现单例的缺陷,但是为了保证线程安全,代码可能过于繁琐了
  • 静态内部类实现单例,结合了饿汉式和双重检查的懒汉式不仅保证了懒加载和线程安全还使代码更加简洁
  • global
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值