Java类中各部分内容的加载执行顺序

news2025/12/15 6:48:39

目录

1. 静态初始化(类加载阶段)

示例代码

输出

2. 实例初始化(对象创建阶段)

详细顺序

示例代码

输出

3. 关键规则总结

4. 注意事项

5. 完整流程图


在Java中,类的实例化过程(对象创建)遵循严格的执行顺序,包含静态初始化、实例变量初始化、构造代码块(实例代码块)以及构造方法的执行。以下是详细的分步说明:


1. 静态初始化(类加载阶段)

当一个类首次被加载到内存时,执行以下步骤(仅执行一次):

  1. 父类的静态变量初始化和静态代码块(如果存在继承关系)。
  2. 子类的静态变量初始化和静态代码块
    • 静态变量和静态代码块的执行顺序由它们在代码中的声明顺序决定。
示例代码
class Parent {
    static {
        System.out.println("父类静态代码块");
    }
    static String parentStaticVar = initParentStaticVar();
    static String initParentStaticVar() {
        System.out.println("父类静态变量初始化");
        return "parent";
    }
}

class Child extends Parent {
    static String childStaticVar = initChildStaticVar();
    static {
        System.out.println("子类静态代码块");
    }
    static String initChildStaticVar() {
        System.out.println("子类静态变量初始化");
        return "child";
    }
}
输出
父类静态代码块
父类静态变量初始化
子类静态变量初始化
子类静态代码块

2. 实例初始化(对象创建阶段)

每次通过new关键字创建对象时,执行以下步骤:

  1. 父类的实例变量初始化和实例代码块(如果存在继承关系)。
  2. 父类的构造方法
  3. 子类的实例变量初始化和实例代码块
  4. 子类的构造方法
详细顺序
  1. 父类实例变量初始化和实例代码块
    • 按照代码中的声明顺序执行。
  2. 父类构造方法
    • 默认调用父类无参构造方法(如果没有显式调用其他构造方法)。
  3. 子类实例变量初始化和实例代码块
    • 按照代码中的声明顺序执行。
  4. 子类构造方法
示例代码
class Parent {
    String parentVar = initParentVar();
    {
        System.out.println("父类实例代码块");
    }
    Parent() {
        System.out.println("父类构造方法");
    }
    String initParentVar() {
        System.out.println("父类实例变量初始化");
        return "parent";
    }
}

class Child extends Parent {
    String childVar = initChildVar();
    {
        System.out.println("子类实例代码块");
    }
    Child() {
        System.out.println("子类构造方法");
    }
    String initChildVar() {
        System.out.println("子类实例变量初始化");
        return "child";
    }
}

public class Main {
    public static void main(String[] args) {
        new Child();
    }
}
输出
父类实例变量初始化
父类实例代码块
父类构造方法
子类实例变量初始化
子类实例代码块
子类构造方法

3. 关键规则总结

  1. 静态优先于实例
    • 静态变量和静态代码块在类加载时执行,且仅执行一次。
  2. 父类优先于子类
    • 无论是静态初始化还是实例初始化,父类先于子类执行。
  3. 声明顺序决定执行顺序
    • 静态变量/代码块、实例变量/代码块的执行顺序由它们在代码中的位置决定。
  4. 构造方法最后执行
    • 构造方法中的代码在实例变量和实例代码块之后执行。

4. 注意事项

  1. 避免在构造方法中调用可被覆盖的方法

    • 如果父类构造方法调用了子类重写的方法,此时子类实例变量可能尚未初始化,导致意外行为。
    class Parent {
        Parent() {
            print(); // 危险:子类重写的方法可能访问未初始化的变量
        }
        void print() {
            System.out.println("Parent");
        }
    }
    
    class Child extends Parent {
        int value = 10;
        @Override
        void print() {
            System.out.println("Child.value = " + value); // 输出0(未初始化)
        }
    }
    
  2. 静态变量依赖

    • 静态变量的初始化顺序可能导致依赖问题(如循环依赖)。

5. 完整流程图

类加载阶段:
    父类静态变量/代码块 → 子类静态变量/代码块

对象实例化阶段:
    父类实例变量/代码块 → 父类构造方法 → 子类实例变量/代码块 → 子类构造方法

        通过理解这些规则,可以避免因初始化顺序导致的逻辑错误,例如变量未初始化、空指针等问题。


        这篇博客到这里就接近尾声了,希望我的分享能给您带来一些启发和帮助,别忘了点赞、收藏。您的每一次互动、鼓励是我持续创作的动力!期待与您再次相遇,共同探索更广阔的世界!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API Gateway CLI 实操入门笔记(基于 LocalStack)

API Gateway CLI 实操入门笔记(基于 LocalStack) Categories: Cloud Google Rank Proof: No Last edited time: May 26, 2025 4:18 AM Status: Early draft Tags: aws 主要先简单的走一下流程,熟悉一下在 terminal 操作 API Gateway local…

数据分析案例-基于红米和华为手机的用户评论分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

深度学习入门:从零搭建你的第一个神经网络

深度学习入门:从零搭建你的第一个神经网络 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 深度学习入门:从零搭建你的第一个神经网络摘要引言第一章:神经网络基础原理1.1 神经元…

【Python办公】Excel简易透视办公小工具

目录 专栏导读1. 背景介绍2. 功能介绍3. 库的安装4. 界面展示5. 使用方法6. 实际应用场景7. 优化方向完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系…

Linux系列-2 Shell常用命令收集

背景 本文用于收集Linux常用命令(基于Centos7),是一个持续更新的博客,建议收藏,编写shell时遇到问题可以随时查阅。 1.Shell类型 shell是用C语言编写的程序,作为命令解释器连接着用户和操作系统内核。常见的shell有sh(Bourne She…

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值

MATLAB使用多个扇形颜色变化表示空间一个点的多种数值 excel中表格中数据格式,多行 lonlatdata1data2data3117380.11100 clear;close all; figure(Position,[100 100 800 800]);num_points 14; [num,txt,raw] xlsread(test.xlsx); x num(:,1); y num(:,2);d…

CAD精简多段线顶点、优化、删除多余、重复顶点——CAD c#二次开发

附部分代码如下: public static void Pl精简(){Document doc Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;var plOrigon db.SelectCurve("\n选择多段线:");…

输电线路的“智慧之眼”:全天候可视化监测如何赋能电网安全运维

在电力需求持续攀升、电网规模日益庞大的今天,输电线路的安全稳定运行面临着前所未有的挑战。线路跨越地形复杂多变,尤其是在偏远山区、铁路沿线及恶劣天气条件下,传统的人工巡检方式显得力不从心——效率低、风险高、覆盖有限。如何实现更智…

两阶段法目标检测发展脉络

模式识别期末展示大作业,做个记录,希望大家喜欢。 R-CNN Fast R-CNN R-FCN 整个过程可以分解为以下几个步骤: 输入图像 (image) 和初步特征提取 (conv, feature maps): 首先,输入一张原始图像,经过一系列…

小白的进阶之路系列之六----人工智能从初步到精通pytorch数据集与数据加载器

本文将介绍以下内容: 数据集与数据加载器 数据迁移 如何建立神经网络 数据集与数据加载器 处理数据样本的代码可能会变得混乱且难以维护;理想情况下,我们希望我们的数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供了两个数据原语:torch.utils…

NestJS——重构日志、数据库、配置

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

c++数据结构8——二叉树的性质

一、二叉树的基本性质 示图1: 性质1:层节点数上限 在一棵二叉树中,第i层至多有2^{i-1}个节点(首层是第1层) 这个性质可以通过数学归纳法证明: 第1层:2^{1-1}2^01个节点(根节点&am…

Window Server 2019--08 网络负载均衡与Web Farm

本章要点 1、了解网络负载均衡技术 2、掌握Web Farm核心原理 3、掌握如何使用Windows NLB搭建Web Farm环境 网络负载均衡技术将外部计算机发送的连接请求均匀的分配到服务器集群中的每台服务器上,接受到请求的服务器独立地响应客户的请求。 网络负载均衡技术还…

SpringBoot:统一功能处理、拦截器、适配器模式

文章目录 拦截器什么是拦截器?为什么要使用拦截器?拦截器的使用拦截路径执行流程典型应用场景DispatcherServlet源码分析 适配器模式适配器模式定义适配器模式角色适配器模式的实现适配器模式应用场景 统⼀数据返回格式优点 统一处理异常总结 拦截器 什…

AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!

在人工智能技术持续深入行业应用的背景下,越来越多的企业和个人寻求通过自动化技术来提高效率和减少重复性劳动,AI Agent的崛起已经成为了不可忽视的趋势。AI Agent,即人工智能代理,是一种基于先进的人工智能技术,特别…

Onvif协议:IPC客户端开发-IPC相机控制(c语言版)

前言: 本博文主要是借鉴OceanStar大神的博文,在他的博文的基础之上做了一部分修改与简化。 博文链接: Onvif协议:IPC客户端开发之鉴权_onvif鉴权方式-CSDN博客 Onvif协议:IPC客户端开发之PTZ控制_onvif ptz-CSDN博客…

如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?

PyTorch是一门科学——现代深度学习工程中的一把锋利利器。它的简洁、优雅、强大,正在让越来越多的AI研究者、开发者深度应用。 1. PyTorch到底是什么?为什么它重要? PyTorch是一个开源的深度学习框架,由Facebook AI Research(FAIR)于2016年发布,它的名字由两个部分组成…

QT+opecv如何更改图片的拍摄路径

如何更改相机拍摄图片的路径 前言:基础夯实:效果展示:实现功能:遇到问题:未解决: 核心代码: 前言: 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题,用户可自己选…

秋招Day11 - JVM - 类加载机制

了解类的加载机制吗? JVM是运行Java字节码,也就是运行.class文件的虚拟机,JVM把.class文件中描述类的数据结构加载到内存中,并对数据进行校验,解析和初始化,最终转化为JVM可以使用的类型(Klass…

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 (1)查询成功 (2)查询失败 (3)SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 (1)盲注分析 (2&#xf…