java创建对象过程理解

本文详细阐述了Java类从加载到卸载的生命周期,包括加载、链接(验证、准备、解析)、初始化、使用和卸载阶段。同时,深入解析了对象创建过程,从静态变量初始化、静态代码块、构造器到实例变量初始化的执行顺序。通过一个具体的例子展示了类和对象的初始化流程,有助于理解Java内存管理和类的加载机制。
摘要由CSDN通过智能技术生成

类的声明周期

加载(loading) -> 链接(linking) -> 初始化(initialization) -> 使用(Using) -> 卸载(unloading)

链接(linking):验证(verification) -> 准备(preparation) -> 解析(Resolution)

初始化

父类静态变量、父类静态初始化块 -> 子类静态变量、子类静态初始化块 -> 子类main方法 -> 父类变量、父类初始化块 -> 父类构造器 -> 子类变量、子类初始化块 -> 子类构造器

创建过程

例:

public class Test002 {
    public static void main(String[] args) {
        System.out.println("----------------------main----------------------");
        Student student = new Student();
        System.out.println("----------------------main----------------------");
        student.study();
    }
}
public class Person {
    private static final String NAME = "父类";
    private String name;
    private int age = 10;

    private static String attribute = "父类静态变量 ->" + NAME;

    public Person(){
        System.out.println("父类 -> 构造器");
    }

    static {
        System.out.println("父类静态变量 ->" + attribute);
        System.out.println("父类 -> 静态代码块");
    }

    {
        System.out.println("父类静态变量 ->" + age);
        System.out.println("父类 -> 代码块");
    }

    public void walk() {
        System.out.println("走路.....");
    }

    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;
    }
}
public class Student extends Person {
    private static final String NAME = "子类";
    private String level = "高一";

    private static String attribute = "子类静态变量 -> " + NAME;
    public Student(){
        System.out.println("子类 -> 构造器");
    }

    static {
        System.out.println("子类 -> " + attribute);
        System.out.println("子类 -> 静态代码块");
    }

    {
        System.out.println("子类 -> " + level);
        System.out.println("子类 -> 代码块");
    }


    public void study() {
        System.out.println("学习.....");
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }
}
  1. JVM去方法区找Test002类的代码信息,如果找到,直接使用,找不到则通过类加载器进行加载,加载完成后会将类信息(构造方法、接口定义)、静态变量、常量信息放入方法区。运行时常量池也在方法区放置,每个对象有自己的常量池。调用main方法时,将main方法放入到栈中。

  2. 执行main方法,执行Student student = new Student();

    1. JVM会去方法区找Student类的代码信息,如果找到,则直接调用,没有找到的话,则通过类加载器进行加载。加载完成后,将类信息、静态变量、常量信息放入方法区

      • 加载Student和父类的Class文件,生成Class对象
      • 校验Student和父类Class文件是否符合JVM规范
      • 进行静态变量内存的申请以及值的初始化(0、null)
      • 将常量符号引用转化为直接引用
        • 理解:将常量值放入到运行时常量池,将引用赋值给属性
    2. 在main方法栈中声明student变量

    3. 进行Student对象的初始化 - new Student()

      • 在堆中为对象开辟一个内存

      • 进行对象的初始化

        父类静态变量 ->父类静态变量 ->父类
        父类 -> 静态代码块
        子类 -> 子类静态变量 -> 子类
        子类 -> 静态代码块
        父类静态变量 ->10
        父类 -> 代码块
        父类 -> 构造器
        子类 -> 高一
        子类 -> 代码块
        子类 -> 构造器
        
    4. 将初始化完成后的Student对象地址赋值给栈中的student局部变量

  3. 执行student.study()方法,去方法区调用该方法

参考:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值