当前位置: 首页 > article >正文

在 Java 中,“对象的创建”与“对象的加载”有什么不一样

在 Java 中,“对象的创建”和“对象的加载”是两个不同的概念,它们涉及类的生命周期的不同阶段。下面详细解释这两个概念的区别:

1. 对象的创建

对象的创建是指在运行时通过 new 关键字、反射、序列化等方式创建一个新的对象实例的过程。这个过程包括以下几个步骤:

  1. 分配内存:为新对象分配足够的内存空间。
  2. 初始化对象:调用构造函数对对象的成员变量进行初始化。
  3. 返回引用:返回指向新对象的引用。
示例代码
public class MyClass {
    private int value;

    public MyClass(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建 MyClass 的对象
        MyClass obj = new MyClass(10);
        System.out.println("Value: " + obj.getValue());
    }
}

2. 类的加载

类的加载是指将类的字节码文件(.class 文件)加载到 JVM 的内存中,并进行解析、验证、准备、初始化等过程。类的加载主要由类加载器(ClassLoader)负责,整个过程包括以下几个阶段:

  1. 加载(Loading)

    • 从文件系统、网络或其他来源读取类的字节码文件。
    • 将字节码文件转换成 Class 对象。
  2. 验证(Verification)

    • 确保字节码文件符合 JVM 规范,没有非法的字节码指令。
    • 验证类的结构是否正确。
  3. 准备(Preparation)

    • 为类的静态变量分配内存,并设置默认初始值(如 0falsenull 等)。
    • 这个阶段不会执行初始化代码(如静态初始化块)。
  4. 解析(Resolution)

    • 将符号引用解析为直接引用。
    • 符号引用是以常量池中的描述符形式存在的,直接引用是直接指向内存地址的指针。
  5. 初始化(Initialization)

    • 执行类的初始化代码,包括静态变量赋值和静态初始化块。
    • 这是类加载的最后一个阶段,也是唯一一个可以执行用户代码的阶段。
示例代码
public class MyClass {
    static {
        System.out.println("Static block initialized");
    }

    private static int staticVar = 10;

    private int instanceVar = 20;

    public MyClass() {
        System.out.println("Constructor called");
    }

    public static void main(String[] args) {
        // 类的加载发生在第一次使用类时
        System.out.println("Before object creation");
        MyClass obj = new MyClass();
        System.out.println("After object creation");
    }
}

输出

Static block initialized
Before object creation
Constructor called
After object creation

区别总结

  • 对象的创建

    • 发生在运行时。
    • 创建具体的对象实例。
    • 涉及内存分配、初始化和返回引用。
    • 通常通过 new 关键字、反射、序列化等方式实现。
  • 类的加载

    • 发生在类的首次使用时。
    • 加载类的字节码文件到 JVM 内存中。
    • 涉及字节码的读取、验证、准备、解析和初始化。
    • 由类加载器(ClassLoader)负责。

通过理解这两个概念的区别,可以更好地掌握 Java 类的生命周期和对象的管理。


http://www.kler.cn/news/340522.html

相关文章:

  • 网络层协议 --- IP
  • imageJ 将多图中的同一条划线数据用曲线展示
  • Qt 中的 QChartView
  • 微信小程序-npm支持-如何使用npm包
  • 2023 CCPC哈尔滨 报告
  • java内存控制
  • QT 10.8
  • 大模型客服的未来发展趋势
  • ISO IEC 18004 2015 PDF 文字版下载
  • 算法笔记day02
  • 【C语言】常见概念
  • 【C++】空指针和野指针
  • JavaScript APIs
  • Next.js 详解
  • tp8 验证码如何访盗刷
  • 八股文面试题总结(包含主流的面试经典题)
  • Oracle 表空间异构传输
  • Spring Boot集成RBloomFilter快速入门Demo
  • 【无标题】获取网页文本
  • OpenJudge | Disk Tree