Java类加载与常量池

常量池:常说的常量池主要分三种,字符串常量池,class常量池,运行时常量池
字符串常量池:常称为串池,1.6之前放在永久代的方法区,1.7之后放在堆中
class常量池:编译阶段,存放各种字面量和符号引用
运行时常量池:运行阶段,Java虚拟机将class文件加载进内存后,将符号引用进行动态链接
Java代码在编译后,会产生对应的class文件(.class后缀)
jvm虚拟机在编译时启动,执行class字节码的内容
方法区之前在堆中,1.8之后在元空间
在这里插入图片描述

Java编译:编译一个类时,会预先编译被这个类所依赖的类
编译后的字节码分两部分:常量池和方法字节码
可用javap -v实现反编译

Java运行可分为两个阶段,类加载,类执行
jvm采取懒汉的类加载机制,当程序第一次主动使用类的时候,才会去对类进行加载,且只加载一次

Java中的public和protected实例方法都采用动态绑定方法,私有,静态,构造器及初始化方法采取静态绑定机制
在这里插入图片描述

Java类加载的七个阶段

加载,验证,准备,解析,初始化,使用,卸载
类加载:将Class文件加载进内存
验证:检验是否是合法的class文件,开头是否是Ox cafe bene
检验代码逻辑,eg要求传入string但是传入int
准备:为类变量分配内存(Java变量分类变量和类成员变量)
note:此处的类变量特指static变量
初始化类型:在准备阶段,JVM会为类变成员量分配内存并初始化为对应数据类型的零值
特例:被static final修饰的变量,在准备阶段就赋予期望的值
public static final int number = 3;
解析:将常量池中的符号引用变为其在直接内存中的直接引用
初始化:根据语句顺序执行,对类对象进行初始化,触发初始化的的五种情况:
1.new,getstatic,putstatic,invokestatic四条指令
对应场景,new一个对象,读取或设置类的静态字段(final修饰的静态常量除外),调用类的静态方法时
2.用reflect进行反射调用时,如果类没有进行初始化,需要
3.初始化子类,必先初始化父类
4.main方法所在的类会优先进行初始化
卸载:当程序代码执行完毕,JVM便开始销毁创建的class对象,JVM退出内存

·在new一个对象时,类成员变量初始化及调用顺序
父static变量,父static代码块,子static变量,子static代码块
main->父成员变量,父构造方法,父构造函数
子。。。
静态代码块:用static声明,JVM加载类时执行,且只执行一次
构造代码块:一个对象建立时执行,且只执行一次,用于给所有类对象初始化
静态内部类的加载与外部加载相互独立,按照需要加载

类初始化,在Java代码编译成字节码后,没有构造方法的概念,只有类初始化对象初始化方法
类初始化方法一般在类初始化的时候执行,对象初始化一般在实例化对象时执行
例如:(类初始化方法)
static
{
System.out.println(“书的静态代码块”);
}
static int amount = 112;

对象初始化方法
{
System.out.println(“书的普通代码块”);
}
int price = 110;
System.out.println(“书的构造方法”);
System.out.println(“price=” + price +",amount=" + amount);
易错点:通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。

分析类的执行顺序(重点,难点)

定类变量的初始值。在类加载的准备阶段,JVM 会为类变量初始化零值,这时候类变量会有一个初始的零值。如果是被 final 修饰的类变量,则直接会被初始成用户想要的值。
初始化入口方法。当进入类加载的初始化阶段后,JVM 会寻找整个 main 方法入口,从而初始化 main 方法所在的整个类。当需要对一个类进行初始化时,会首先初始化类构造器(),之后初始化对象构造器()。
初始化类构造器。JVM 会按顺序收集类变量的赋值语句、静态代码块,最终组成类构造器由 JVM 执行。
初始化对象构造器。JVM 会按照收集成员变量的赋值语句、普通代码块,最后收集构造方法,将它们组成对象构造器,最终由 JVM 执行。

参考链接https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值