跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 类加载及 new 对象的过程

Java 对象创建过程包含编译生成字节码、类加载器加载父类与子类 Class 文件、初始化静态属性与代码块、堆内存分配、实例属性与构造代码块执行以及构造方法调用。首次 new 对象时加载并初始化父类与子类静态部分,后续 new 仅执行实例初始化。

极客工坊发布于 2017/6/26更新于 2026/6/1519 浏览
Java 类加载及 new 对象的过程

Java 类加载及 new 对象的过程

SubClass sub = new SubClass(); 这句话到底做了什么事情呢?

  1. javac 编译:Java 源文件形成.class 字节码文件;
  2. new SubClass() 对象时,先检查有没有父类,有父类,类加载器 (ClassLoader) 先将父类的 Class 文件读入内存,创建一个 java.lang.Class 对象,然后加载子类,类加载器将子类的 Class 文件读入内存,创建一个 java.lang.Class 对象;
  3. 先初始化父类的静态属性,再初始化父类的静态代码块;
  4. 再初始化子类的静态属性,再初始化子类的静态代码;
  5. 在堆内存中分配内存空间,分配内存地址,此时是因为父类的特有属性才在堆内存中为父类对象分配空间。
  6. 初始化父类的特有属性。
  7. 初始化父类的构造代码块。
  8. 初始化父类对象相应的构造方法。
  9. 在堆内存中分配内存空间,分配内存地址,此时是因为子类的特有属性才在堆内存中为子类对象分配空间的。
  10. 初始化子类的特有属性。
  11. 初始化子类的构造代码块。
  12. 初始化子类相应的构造方法。
  13. 将子类的内存地址赋值给栈中的引用对象。
public class ParentClass {
    // 静态变量
    public static String staticField = "父类--静态变量";
    public String field = "父类--普通变量";
    // 静态块
    static {
        System.out.println(staticField);
        System.out.println("父类--静态块");
    }
    // 初始化块
    {
        System.out.println(field);
        System.out.println("父类--普通块");
    }
    // 构造器
    public ParentClass() {
        System.out.println("父类--构造器");
    }
}

public class SubClass extends ParentClass {
    // 静态变量
    public static String sstaticField = "子类--静态变量";
    // 变量
    public String sField = "子类--变量";
    // 静态块
    static {
        System.out.println(sstaticField);
        System.out.println("子类--静态块");
    }
    // 初始化块
    {
        System.out.println(sField);
        System.out.println("子类--普通块");
    }
    // 构造器
    public SubClass() {
        System.out.println("子类--构造器");
    }
    public static void main(String[] args) {
        System.out.println("顺序:" + "第一次 new SubClass");
        SubClass sub = new SubClass();
        System.out.println("顺序:" + "第二次 new SubClass");
        new SubClass();
    }
}

程序执行的结果为:

父类–静态变量
父类–静态块
子类–静态变量
子类–静态块
顺序:第一次 new SubClass
父类–普通变量
父类–普通块
父类–构造器
子类–变量
子类–普通块
子类–构造器
顺序:第二次 new SubClass
父类–普通变量
父类–普通块
父类–构造器
子类–变量
子类–普通块
子类–构造器

目录

  1. Java 类加载及 new 对象的过程
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java 文件操作与 IO 流读写实战
  • Stable Diffusion 与 I2VGen-XL 图像转视频技术对比
  • 40 个 Python 可视化图表案例及代码实现
  • DWR3 基于 Spring MVC 配置 Controller 的方法
  • MySQL 内置函数与内外连接查询详解
  • Anthropic AI Agent 构建最佳实践与核心范式解析
  • Android 进阶:深入底层学习 Framework 指南
  • OpenClaw 本地部署与 cpolar 外网访问配置指南
  • Android Framework 源码解析与核心原理详解
  • 开源 AI 短剧工具教程:从小说到视频生成的流水线实现
  • Android Camera Framework 层调用流程深度解析
  • Android 开发者进阶指南:八大核心模块技术体系与职业路径规划
  • Node.js Morgan 日志模块本地时间格式配置
  • 构建基于 Agent 的 GitHub 自动化工作流实战指南
  • Stable Diffusion WebUI 核心功能与参数调优指南
  • 使用 Rust 构建支持 Python 脚本执行的 Agent 框架虚拟运行环境
  • JSP、MVC、EL、JSTL 核心技术笔记
  • OpenClaw 修改运行目录导致 Gateway Closed 异常修复指南
  • AI 模型训练核心要素解析:神经网络与训练原理
  • Vivado FPGA 开发工具安装指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online