《Java 100 天进阶之路》第20篇:Java初始化、构造器、对象创建的过程

Java中类的初始化与实例化总结(类初始化的触发时机,类的实例化触发时机,new一个对象的过程) 全是干货,一网打尽类的基础知识!先看看下面的问题都能回答上来吗? 描述new一个对象的过程,并结合例子说明。 类初始化的触发时机。 多线程进行类的初始化会出问题吗? 类的实例化触发时机。 <clinit>()方法和<init>()方法区别。 在类都没有初始化完毕之前,能直接进行实例化相应的对象吗? 类的初始化过程与类的实例化过程的异同? 一个实例变量在对象初始化的过程中会被赋值几次? 描述new一个... 阅读详情

第20篇:Java初始化、构造器、对象创建的过程


📌 系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第19篇:Java接口的作用和意义 |
➡️ 下一篇:第21篇:Java Object类


一、核心知识点

  • 成员初始化顺序:
    • 静态成员(静态变量、静态代码块)在类加载时执行,按声明顺序执行
    • 实例成员(实例变量、实例代码块)在创建对象时执行,在构造方法之前执行
    • 构造方法最后执行
  • 构造器(构造方法)的作用:初始化对象状态
  • 对象创建的完整流程(JVM 角度):
    1. 类加载检查(如果类未加载,先加载)
    2. 堆中分配内存
    3. 设置默认值(零值)
    4. 设置对象头(类型指针、GC 信息等)
    5. 执行实例初始化:实例变量显式赋值 → 实例代码块 → 构造方法
  • 父子类初始化顺序:先父类静态 → 子类静态 → 父类实例变量/代码块 → 父类构造 → 子类实例变量/代码块 → 子类构造

二、通俗讲解(1分钟开心学)

1. 初始化过程就像“盖房子”

  • 类加载:先设计图纸(静态成员),只做一次。
  • 对象创建:每次建房,都要打地基(默认值)、砌墙(显式赋值)、内部装修(实例代码块)、最后交房(构造方法)。

2. 静态成分(类级别)
当你第一次使用一个类时(new、访问静态变量/方法、Class.forName等),JVM 会加载这个类,并执行:

  • 静态变量赋值
  • 静态代码块(按代码顺序)

3. 实例成分(对象级别)
每次 new 一个对象,都会执行:

  • 实例变量显式赋值
  • 实例代码块({ ... } 中的内容,按顺序)
  • 构造方法

4. 继承时的顺序

想象你创建子类对象,必须先给父类“打好地基”:
父类静态 → 子类静态 → 父类实例初始化 → 父类构造 → 子类实例初始化 → 子类构造

面试口诀:
“父静子静,父实父构,子实子构”

三、实操代码案例 + 场景说明

场景:通过打印日志,直观看到初始化的完整顺序。

1. 单个类的初始化顺序

class Student {
    private String name = initName();   // 实例变量显式赋值
    private static int counter = initCounter();  // 静态变量
    
    static {
        System.out.println("2. 静态代码块执行");
    }
    
    {
        System.out.println("4. 实例代码块执行");
    }
    
    public Student() {
        System.out.println("5. 构造方法执行");
    }
    
    private static int initCounter() {
        System.out.println("1. 静态变量赋值 (initCounter)");
        return 0;
    }
    
    private String initName() {
        System.out.println("3. 实例变量赋值 (initName)");
        return "默认";
    }
}

// 执行 new Student() 输出:
// 1. 静态变量赋值
// 2. 静态代码块执行
// 3. 实例变量赋值
// 4. 实例代码块执行
// 5. 构造方法执行

2. 继承时的完整顺序

class Parent {
    static { System.out.println("A. 父类静态块"); }
    { System.out.println("C. 父类实例块"); }
    Parent() { System.out.println("D. 父类构造方法"); }
}

class Child extends Parent {
    static { System.out.println("B. 子类静态块"); }
    { System.out.println("E. 子类实例块"); }
    Child() { System.out.println("F. 子类构造方法"); }
}

// 执行 new Child() 输出:
// A. 父类静态块
// B. 子类静态块
// C. 父类实例块
// D. 父类构造方法
// E. 子类实例块
// F. 子类构造方法

3. 对象创建的内存流程(代码配合注释)

public class MemoryProcess {
    private int value = 100;   // ① 默认值0 → ② 显式赋值为100
    private String text;       // 默认null,没有显式赋值
    
    public MemoryProcess(String text) {
        this.text = text;      // ③ 构造方法中赋值
    }
}
// 执行 new MemoryProcess("hello"):
// 1. 堆中分配内存
// 2. value = 0, text = null (默认值)
// 3. value = 100 (显式赋值)
// 4. text = "hello" (构造方法)

四、避坑要点

错误/误区后果正确做法
在静态代码块中访问实例成员编译错误静态上下文只能访问静态成员
实例代码块中抛出未捕获异常对象创建失败,异常传播给调用者尽量不在实例代码块中写复杂逻辑
构造方法中调用可被子类重写的方法子类未初始化完成,可能空指针只调用 private 或 final 方法
this() 和 super() 同时出现在构造方法中编译错误只能选其一,且必须在第一行

五、面试高频考点

Q1:静态代码块、实例代码块、构造方法的执行顺序?

类加载:静态代码块。对象创建:实例变量显式赋值和实例代码块(按顺序) → 构造方法。继承时先父类后子类。

Q2:一个对象创建时,内存中发生了什么?

① 类加载(如果没加载)→ ② 堆中分配内存 → ③ 成员变量设默认值 → ④ 设置对象头 → ⑤ 实例初始化(显式赋值、实例代码块、构造方法)。

Q3:构造方法中调用普通方法有什么风险?

如果该方法被子类重写,调用时会执行子类版本,而此时子类的成员可能尚未初始化(null 或 0),导致逻辑错误或空指针。

六、练习题

  1. 预测输出:
    class A {
        static { System.out.print("A1 "); }
        { System.out.print("A2 "); }
        A() { System.out.print("A3 "); }
    }
    class B extends A {
        static { System.out.print("B1 "); }
        { System.out.print("B2 "); }
        B() { System.out.print("B3 "); }
    }
    public class Test { public static void main(String[] args) { new B(); } }
    
  2. 代码改错:下面代码哪里有问题?如何修正?
    class Base {
        public Base() { print(); }
        void print() { System.out.println("Base"); }
    }
    class Derived extends Base {
        private String value = "Hello";
        @Override void print() { System.out.println(value.toUpperCase()); }
    }
    
  3. 动手:写一个类,包含静态代码块、实例代码块、构造方法,并在 main 中创建多个对象,观察输出。

📊 你的学习进度

  • 当前:第20篇 / 共44篇 · 第二阶段:核心语法与面向对象(第5~20篇)
  • ✅ 已完成:第1~19篇
  • 📖 正在学:第20篇
  • ⏳ 待学习:第21~44篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!


👉 下一篇预告

《Java Object类》

内容简介:toString、equals、hashCode的正确重写规范,equals与hashCode的契约,getClass、clone方法。

💡 学完这篇,你将掌握所有类的共同“祖先”,写出规范的Java Bean。

📌 《Java 100 天进阶之路 | 从入门到上岗就业》 每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!

手把手教你用Docker快速部署ZLMediaKit流媒体服务器(含WebRTC配置) 本文详细介绍了如何使用Docker快速部署ZLMediaKit流媒体服务器,并配置WebRTC功能。通过容器化部署,实现环境一致性、资源隔离和快速扩展,同时提供WebRTC专项配置、多协议推拉流实战测试及生产环境优化建议,帮助开发者高效搭建企业级流媒体平台。 阅读详情

相关推荐

AF3 ProteinDataset类的_patch方法解读

AlphaFold3 protein_dataset模块 ProteinDataset 类  _patch 方法的主要目的是围绕锚点残基(anchor residues)裁剪蛋白质数据,提取一个局部补丁(patch)作为模型输入。

qq_27390023的博客 1143

深入构造器(1):使用构造器执行初始化

前言:构造器是一个特殊的方法,它主要的作用是在实例化对象的时候,进行对象初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射等方式创建对象,其实质依然是依赖于构造器),因此, Java 类必须包含—个或一个以上的构造器。篇2:构造器的重载与相互调用 1、构造器的作用 ​ 构造器最大的用处就是在创建对象时执行初始化。前言中已经介绍过了,当创建一个对象时,系统为这个对象的实例变量进行默认初始化,这种默认的初始化把所有基本类型的实例变最设为默认值,如下表所示: 数据类型 默认初始化

Love what you do 1875

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 820

Java对象的创建及存储位置

对象的创建 对象创建过程(“微观”) 当使用构造器创建对象或静态方法、非常数静态域首次被访问时,Java解释器必须查找类路径,定位.class文件 加载.class文件,创建Class对象,有关静态初始化的所有动作都会执行(静态初始化) 当使用new关键字创建对象时,在堆上分配足够的存储空间 存储空间清零/null 执行所有出现于字段定义处的初始化动作(非静态初始化) 执行构造器 对...

远处 7273

建议收藏:华为海思IC设计笔试题,含解析(附下载)

接触过的部门有麒麟芯片、CPU/GPU,总体面试感觉非常好,规范且认真,第一轮手撕代码状态机+复盘机考题+瞄准几个知识点深挖,时间1hour+;一二轮面试是连着的,所以很累。但是岗位就那么多,在面试的时候,很多同学因为准备不充分,与岗位失之交臂,无缘进入该公司。时序电路有记忆功能,不会产生锁存器,锁存器一般在组合逻辑中case写不全,else写不全,或者敏感列表写不全。

nuoweishizi的博客 3279

高通跃龙QCS6490部署yolov11_obb实战:QNN SDK工具链全解析与避坑指南

本文详细解析了在高通跃龙QCS6490平台上部署yolov11_obb模型的实战过程,重点介绍了QNN SDK工具链的使用与优化技巧。从环境配置、模型转换到性能调优,提供了全面的避坑指南和DSP加速配置建议,帮助开发者高效实现旋转框检测任务在边缘设备上的部署。

weixin_29232121的博客 295

java子类创建过程_Java中创建子类对象的执行流程分析

Java中创建子类对象的执行流程分析作者:冯老师,一、影响创建子类对象的几个因素Java中创建一个子类对象时,执行流程比较复杂,主要是由于构造器的重载、this关键字的使用、初始化块、继承及super关键字的存在。下面对这几个因素做个简单介绍。1.方法的重载Java中允许方法的重载,即同一个类中方法名相同,但参数个数不同或参数的类型不同。除了普通的类方法外,构造器也允许重载。且通过this关键字可...

weixin_36377635的博客 3357

【2026年华为暑期实习(AI)-4月22日-第三题- 网络异常流量传播链路溯源】(题目+思路+Java&C++&Python解析+在线测试)

本文提出了一种基于空间距离和流量负载的网络异常传播链检测方法。首先通过曼哈顿距离建立基站间的直接关联关系,形成无向图;然后计算各连通块的总负载,筛选出关键节点;最后在关键节点构成的有向无环图(DAG)中寻找用户数最大的传播路径。算法采用DFS/BFS识别连通块,并通过动态规划求解最长路径,时间复杂度为O(N^2)。该方法适用于监控网络中异常流量的定向传播分析,能有效识别高负载区域和最大影响路径。

m0_73659489的博客 184

java构造器_Java入门第十三课:“如何使用构造器初始化对象?”

#构造器的引入理解构造器之前,首先我们需要知道Java中为什么要引入构造器,以及构造器的作用。构造器就是和类名相同但无返回类型的方法。用于当前或某一对象的实例化,并将当前或某一对象返回。要得到一个类的实例时,往往是要运行其构造函数的。 Java中引入构造器,确保每一个对象都得到初始化,Java在有能力操作对象之前,系统会自动调用相应的构造器,保证初始化的进行。构造器是创建Java对象的重要途径,通...

weixin_39807691的博客 739

Pointnet++改进91:2025最新改进模块-RepMBConv模块

本文提出了一种改进PointNet++网络的方法,通过在特征提取模块中引入RepMBConv结构来提升模型性能。主要内容包括:1)理论部分介绍了RepMBConv的设计原理,包含自监督学习框架、动态上下文建模等创新点;2)详细给出了三步修改步骤:创建包含RepMBConv的Python模块、在pointnet2_utils.py中添加注意力机制、修改pointnet2_sem_seg.py主网络结构;3)代码实现展示了如何将RepMBConv集成到PointNetSetAbstraction模块中,形成Po

AIcurator的博客 271

YOLO26 网络结构逐模块解析:Backbone/Neck/Head

本文解析了YOLO26目标检测网络的架构设计,重点介绍其在Backbone、Neck和Head三个核心组件的创新优化。Backbone采用改进的CSP模块与轻量级注意力机制,提升特征提取效率;Neck使用改进的BiFPN结构实现高效多尺度特征融合;Head采用完全解耦设计简化回归流程。文章详细分析了各模块的技术演进、实现细节和设计思想,通过流程图和代码示例展示了YOLO26的整体架构和关键组件实现。该研究对模型优化、定制开发和硬件部署具有重要指导意义。

一键难忘的博客 1226

《2026全新 | Java 100 天进阶之路:从零基础到上岗就业,108篇完整学习地图》

摘要:不背八股文,不堆概念。44篇基础 + 64篇进阶(共108篇),100天助你达到Java就业水平,从容面对技术面试。 👉 零基础入门 / 校招社招突击 / 1-3年Java后端提升 / 想系统复盘全栈知识的开发者。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 9582

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java对象创建的过程

这包括初始化声明的字段和执行构造方法中的所有语句。在此过程中,可能会调用父类的构造方法,以确保整个继承层次结构中的每个类都得到正确的初始化。在内存中分配对象所需的内存空间。具体的内存分配方式有很多种,包括堆上的对象分配、栈上的对象分配等,在主流的Java虚拟机中,大部分对象的内存分配发生在堆上。内存分配后,JVM将分配给对象的内存空间初始化为零值。创建对象的过程,属于类的主动使用,在加载、连接类完毕后,还会触发类的初始化过程。JVM设置对象头信息,包括类的元数据信息、对象的哈希码、对象的GC分代年龄等。

wwwwwww31311的博客 553

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java对象构造、重载、无参构造、this、初始化、继承的加载顺序、Java new一个对象过程中发生了什么

一、重载 Java允许重载任何方法,而不只是构造器方法。因此,要完整地描述一个方法,许哟啊指定方法名以及参数类型,也就是方法的签名(signature)。 例如:String类有4个名为indexOf的公共方法,它们的签名是 indexOf(int) indexOf(int, int) indexOf(String) indexOf(String, int) 返回类型不是方法签名的一部分,也就是说:两个名字相同、参数类型也相同的、但是返回值类型不同的方法是不合法的。\color{red}{两个名字相同、参

m0_46378271的博客 1021

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java lambda new一个对象_Java对象new初始化顺序

第一次new一个对象最高父类静态初始化块/最高父类静态field声明时初始化 --> ... -->直接父类静态初始化块/直接父类静态Field声明时初始化 --> 本类静态初始化块本类静态Field声明时初始化 // 这个主要是初始化类--> 最高父类非静态初始化块/最高父类非静态Field声明时初始化 --> 最高父类构造器 --> ... --> 直...

weixin_42514640的博客 2909

Java中调用构造器初始化执行顺序

调用构造器初始化执行顺序: 第一步:静态初始化语句、静态初始化块 按顺序依次执行。 第二步:非静态初始化语句、非静态初始化块 按顺序依次执行。 第三步:执行构造器方法。 要是在加载静态部分时,通过new调用构造器,将会先暂停加载后面的静态部分,而去执行实例化。 静态部分只有在类第一次加载的时候,才会执行。之后再加载将不再执行。 示例: public class Test1 { pub...

handsome-h的博客 872

Java中是构造器创建对象吗?

首先,这里说明” Java中是构造器创建对象 “这句话是完全错误的。 Java中构造器的作用主要是为了初始化变量的值...其实在执行构造器之前,Java对象所需要的内存空间,已经产生了... 一般可以理解为由new关键字创建出来的哦。 在某些时候,一般通过new 关键字创建出相应的对象后,可以通过对应的构造方法来初始化对应变量的值。 但在某些特殊情况下,我们可以不通过new关键字而创建出相...

weixin_34066347的博客 527

java在初始化过程_Java初始化过程

这篇文章主要讲解Java在创建对象的时候,初始化的顺序。主要从以下几个例子中讲解:继承关系中初始化顺序初始化块与构造器的顺序已经加载过的类的初始化顺序加载父类,会不会加载子类创建子类对象会不会创建父类对象例子1——继承关系中初始化顺序先看简单的情况,看下面的例子:public class Father {public String fatherVar = "父类构造块初始化";public sta...

weixin_29469195的博客 142

Java基础之构造器

构造器也称构造方法这是构造器的命名方法 java文件编译生成class文件如果你在java文件中没有定义构造器编译会自动生成一个默认构造器1.默认构造器java文件 class文件 构造器的作用完成对新对象的初始化 不是创建对象,而是对对象中的值的初始化由于构造器是 对对象中的属性初始化的一个作用所以可以调用构造器对对象的属性进行初始化而不是创建对象用赋值语句进行初始化当你new文件时候,先系统进行对象创建,然后调用构造器方法(构造器里面的语句会全部执行)2.有参构造器自定义构造器 如

y_k_j_c的博客 4538

java 创建新对象_Java中如何创建一个新的对象的/Creating Objects/

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases.这篇Java教程是为JDK 8而编写的, 文中所描述的例子与实践并没有对后续版本...

weixin_42551310的博客 712

java由谁创建_透析Java本质-谁创建了对象,this是什么

package com.java.essence_36;import java.util.ArrayList;import java.util.List;/*** Created by lw on 14-5-23.* * 构造器做了什么?* 对象是谁创建的?构造器?* this到底是什么?*/class SupperConstructorInvocation {SupperConstructorI...

weixin_28894691的博客 2264

Java中的构造方法(构造器)

qq_51074048的博客 1238

java构造函数创建对象吗_Java中是构造器创建对象吗?

首先,这里说明” Java中是构造器创建对象 “这句话是完全错误的。Java中构造器的作用主要是为了初始化变量的值...其实在执行构造器之前,Java对象所需要的内存空间,已经产生了...一般可以理解为由new关键字创建出来的哦。在某些时候,一般通过new 关键字创建出相应的对象后,可以通过对应的构造方法来初始化对应变量的值。但在某些特殊情况下,我们可以不通过new关键字而创建出相关的对象常见的两...

weixin_29196315的博客 469

Java快速入门(4) - 构造器

本节介绍了如何定义无参构造器和带参构造器

290

java 初始化

java 初始化java初始化有什么特点?怎么初始化?初始化的顺序是什么?实例如下:Test0510.java java初始化有什么特点?怎么初始化?初始化的顺序是什么? 实例如下:Test0510.java //初始化得到保证:类的每个基本类型数据成员在使用前都会得到初始化。 class Init{ boolean b; char c; short s; int i; long l; ...

Imperial_Vmlion的博客 665

Java中子类对象实例化的全过程

在Java编程中,当我们创建一个子类的对象时,会经历一系列的过程,这个过程包括加载类、分配内存、初始化成员变量、调用构造器等步骤。下面我们就来详细讲解一下子类对象实例化的全过程。

qq_36720723的博客 1023
上一篇: Java面试图解笔记【五】异地恋讲CAP,抢票比喻秒杀,8道分布式高阶题
下一篇: 报表篇:一张图看懂仓库——WMS数据报表与可视化全解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值