[Java基础]——类的生命周期

目录

一、 类的加载

二、类的连接

三、初始化

四、使用 五、回收


一、 类的加载

1. 类加载器根据类的全限定名通过不同渠道以二进制流的方式获取字节码信息。

2. 类加载器加载完类之后,字节码信息(基本信息、常量池、字段、方法、虚方法表)会保存在JVM的方法区中。

3. 方法区生成一个InstanceKlass对象,保存类的信息,此外还会在堆中生成一个java.lang.class对象,我们使用的就是这个对象。

4. 注意如果类中有其他引用,该引用对应的类也会被加载。

例如:在加载D类时,发现有另一个引用,那么也会加载、连接、初始化C这个类

public class AnalyzeClass1 {
    public static void main(String[] args) {
        new D();
    }

}
class D{
    C c = new C();
}
class C{

}

 总结:

       Java虚拟机将类信息加载到内存中,一份在堆区、一份在方法区,我们开发使用的一般是堆区中的类。

二、类的连接

验证:1. 验证类是否满足Java虚拟机规范

准备:2. 给静态变量赋初值为0,注意如果一个变量是final修饰的,在此也会被赋初值

连接:3. 将常量池中的符号引用替换成指向内存的直接引用

三、初始化

初始化就是执行静态代码块,或者为静态变量赋值。

  • 以下几种情况会触发类的初始化:

1. 访问一个类的静态变量(基本类型 + 字符串)或者静态方法,注意->变量是final修饰的并且右边是常量不会触发初始化

2. 调用Class.forName()方法

3. new一个该类的对象时

4. 执行Main方法的当前类

  • 不会触发类的初始化

1.访问类的static final静态变量

2.类对象.class不会触发初始化

3.创建该类的数组不会触发初始化

4.类加载器的loadClass方法

5.Class.forName的参数2为false时

笔试题:控制台输出什么

解析:

        main为程序入口,所以先加载Test1字节码文件并初始化,打印D, 然后又打印A,然后new Test1()执行构造方法,而{}代码块内容编译后是在构造代码的第一行先执行的。故答案为:DACBCB

有继承的类的初始化 

解析:

        ①子类继承父类,先初始化父类,在初始化子类

        ②对于成员变量,编译看左边运行看左边,对于方法,编译看左边,运行看右边

故:结果为2 


 如果没有new对象,成员变量是父类的,所以只初始化父类。a = 1

最后注意:

        数组的创建不会导类进行初始化

        静态变量使用final修饰,这类变量会在类加载阶段进行初始化

四、使用 五、回收

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会就选C.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值