深入理解Java类实例化时jvm执行顺序

Solon配置文件详解:从入门到精通,掌握application.properties与application.yml的配置技巧 本文深入解析Solon框架的配置文件使用技巧,涵盖application.properties与application.yml两种格式的选择、配置加载优先级、代码访问方式以及服务器、数据源等核心配置。同时,文章探讨了多环境管理、自定义配置、动态更新等高级技巧,并提供了微服务配置中心集成的实战案例,帮助开发者构建高效、可维护的应用配置体系。 阅读详情

前言


关于jvm类加载器我们面试的时候会经常问到,如果相关概念不清楚的话可以参阅我的深入理解虚拟机之类加载器 。这一篇文章旨在实战演示jvm执行的顺序。

示例代码

package com.jdk.learn;

/**
 * Created by ricky on 2017/8/25.
 *
 * 类加载器加载顺序考究
 *

 *
 */
public class ClassLoaderTest {

    public static void main(String[] args) {
        son sons=new son();
    }
}

class parent{
    private static  int a=1;
    private static  int b;
    private   int c=initc();
    static {
        b=1;
        System.out.println("1.父类静态代码块:赋值b成功");
        System.out.println("1.父类静态代码块:a的值"+a);
    }
    int initc(){
        System.out.println("3.父类成员变量赋值:---> c的值"+c);
        this.c=12;
        System.out.println("3.父类成员变量赋值:---> c的值"+c);
        return c;
    }
    public parent(){
        System.out.println("4.父类构造方式开始执行---> a:"+a+",b:"+b);
        System.out.println("4.父类构造方式开始执行---> c:"+c);
    }
}

class son extends parent{
    private static  int sa=1;
    private static  int sb;
    private   int sc=initc2();
    static {
        sb=1;
        System.out.println("2.子类静态代码块:赋值sb成功");
        System.out.println("2.子类静态代码块:sa的值"+sa);
    }
    int initc2(){
        System.out.println("5.子类成员变量赋值--->:sc的值"+sc);
        this.sc=12;
        return sc;
    }
    public son(){
        System.out.println("6.子类构造方式开始执行---> sa:"+sa+",sb:"+sb);
        System.out.println("6.子类构造方式开始执行---> sc:"+sc);
    }
}

执行结果

 1.父类静态代码块:赋值b成功
 1.父类静态代码块:a的值1
 2.子类静态代码块:赋值sb成功
 2.子类静态代码块:sa的值1
 3.父类成员变量赋值:---> c的值0
 3.父类成员变量赋值:---> c的值12
 4.父类构造方式开始执行---> a:1,b:1
 4.父类构造方式开始执行---> c:12
 5.子类成员变量赋值--->:sc的值0
 6.子类构造方式开始执行---> sa:1,sb:1
 6.子类构造方式开始执行---> sc:12

分析

当我们进行new实例化进行操作的时候,JVM都进行了什么操作呢?
如果你看过深入理解jvm的话,应该会比较清楚,当我们使用new关键字进行实例化的时候,会进行如下几步处理:

  • 加载
    • 此阶段加载类的字节码信息到内存
  • 连接
    • 此阶段进行验证,分配默认值,符号引用转直接引用
  • 初始化
    • 为成员进行赋值等
  • 使用
    • 对实例进行操作比如sons.toString()

对于我们的实例而言,我们只关注连接和初始化阶段即可。
连接阶段我们按照类结构(成员变量(先),方法(后)等)的顺序(不是书写顺序),先对变量进行赋默认值0,对象的话为null。

初始化的时候,就是对对象进行赋值,比如c执行initc()进行赋值。

Java创建对象的五种方法详解与实战Demo Cloneable是标记接口,JVM据此允许执行clone操作;若未实现则抛出。是反序列化前提,否则无法通过ObjectInputStream重建对象。工厂模式虽无强制接口要求,但常配合接口编程以实现解耦。 阅读详情

相关推荐

JVM执行顺序

类加载器:加载-验证-准备-解析-初始化 静态方法-普通方法-构造方法 执行顺序: 父类静态代码块 子类静态代码块 父类普通代码块 父类构造方法 子类普通代码块 子类构造方法

Alan的博客 1156

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4829

java shutdown hook_Java中的JVM Shutdown Hook - Break易站

Java 多线程Shutdown Hooks是一种特殊的结构,允许开发人员插入一段代码,以便在JVM关闭时执行。如果我们需要在VM关闭的情况下进行特殊的清理操作,这就派上用场了。使用常规构造处理此问题,例如确保在应用程序存在之前调用特殊过程(调用System.exit(0))将不适用于VM因外部原因而关闭的情况(例如kill请求)来自O / S),或者由于资源问题(内存不足)。正如我们将很快看到的...

weixin_42298971的博客 229

【STM32项目】老人健康跌倒检测系统实现(附教程PCB资料)

功能概述 跌倒检测 倾倒告警,人体角度倾斜至阈值触发蜂鸣报警 异常运动,加速度超过正常行动阈值时触发报警 心率监测 实时检测心率数据 血氧监测 实时检测采集血氧 血压测量 血压在线测量 红外体温 非接触体温采集方案 接触式体温采集方案 实时定位 中科微GPSGT-U12双频GPS北斗 GLONASS IRNSS定位系统 NEMA数据解析 可扩展高精度定位方案厘米级 屏幕显示 数据采集显示 告警阈值设置 语音提示 1欢迎使用老人智慧监测系统

洋洋的博客 1万+

基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统

增加了模型的绑定,利用Mediapipe这个强大的库可以实现识别面部表情的捕捉和人体结构运动的捕捉,基于以上的特性加入到Unity的人物模型中,实现实时的面部表情和人体运行的捕捉

BIgbossyii的博客 1万+

JAVA虚拟机关闭钩子(Shutdown Hook)、finally(try,catch)、finalize()调用场景及执行顺序

JAVA虚拟机关闭钩子(Shutdown Hook)、finally(try,catch)、finalize(),三者都能在虚拟机关闭前做一些操作,但是调用场景和执行顺序不一样。 1. JAVA虚拟机关闭钩子(Shutdown Hook)在下面场景下被调用: 1)程序正常退出; 2) 使用System.exit(); 3)终端使用Ctrl+C触发的中断; 4)系统关闭...

yujian111111的博客 998

基于PWM的汽车仪表步进电机微步驱动优化实践

本文深入探讨了基于PWM的微步驱动技术,用于优化汽车仪表步进电机的运行性能。通过将传统的分步驱动升级为PWM微步细分驱动,利用正弦/余弦查表法合成旋转磁场,有效消除了指针抖动与噪声,实现了指针的平滑、精准运动。文章以STM32和VID2905电机为例,提供了详细的硬件连接、代码实现及高级优化技巧,为提升汽车仪表体验提供了实用方案。

weixin_29169505的博客 512

Java中的JVM关闭钩子

Java中的JVM关闭钩子 (翻译篇) 关机钩子是一种特殊的构造,允许开发人员插入一段代码,以便在JVM关闭时执行。当我们需要在VM关闭时执行特殊的清理操作时,这就很方便了。 通常使用关机钩子处理的一般结构,如确保我们调用特殊过程在应用程序退出(调用system . exit(0))将不工作情况下VM关闭是由于外部原因(例如杀死请求从O / S),或由于资源问题(内存)。我们很快就会看到,shutdown钩子很容易解决这个问题,因为它允许我们提供一个任意的代码块,JVM在关闭时将调用这个代码块。 从表面上看

qq_29499107的博客 1万+

Unity WebView 插件⭐️(十八)3D WebView 原生2D模式 — Native 2D Mode

Unity中的 浏览器插件:3D WebView,利用好该插件我们可以自己使用Unity打造出一个自定义的多样化浏览器。可以用于2D显示,也可以用于3D空间场景中使用,在PC端、手机端和VR设备等都可以有一个非常好的效果。一起来浏览器插件:3D WebView的专栏学习使用吧!

努力前行,总会成为自己心中的那道光 7640

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

伶俐角少儿编程 711

java笔记-jvm执行顺序

java加载一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法 。 执行顺序根据静态部分是依赖于类,而不是依赖于对象存在的,所以静态部分的加载优先于对象存在。        1.静态属性,静态方法声明,静态块。   2.动态属性,普通方法声明,构造块。   3.构造方法。 静态:   当加载一个类时,JVM会根据属性的数据类型第一时间赋默认值(一举生成的)。然后

迷途中的一片羽毛博客 695

【学习系列】SAP RAP 8:行为定义-Authorization Control

本文介绍了SAP RAP中的授权控制实现方法,主要分为读取操作和修改操作两种场景。读取操作通过ABAP CDS的数据控制语言(DCL)实现,使用访问控制对象限制数据可见范围;修改操作则通过行为定义中的权限检查,包括全局授权、实例授权和预检查三种方式。文章详细说明了如何使用DCL创建访问控制规则,并通过实例演示了全局授权和实例授权的代码实现方法,以及预检查功能在数据更新前的权限验证。这些授权控制机制共同确保用户只能访问和操作其权限范围内的数据,有效保障系统安全性。

DeveloperMrMeng的博客 436

java 类实例化执行顺序

java 类实例化执行顺序分析。示例代码介绍。

一步一步往上爬 3070

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JVM的秘密:揭开静态块、静态属性、构造块、构造方法的执行顺序之谜

在Java编程中,了解JVM(Java虚拟机)执行代码的顺序对于深入理解程序的运行机制至关重要。本文将详细讲解静态块、静态属性、构造块、构造方法在JVM中的执行顺序,并通过实例代码进行说明。一、静态块、静态属性、构造块、构造方法简介。

qq_44103359的博客 336

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深入理解Java对象的创建过程:类的初始化与实例化

test

博客 976

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2022JAVA面试题附答案(长期更新)

该博客囊括了Java面试中95%的面试题,不包含算法题。如有遗漏或错误,请立刻联系我,十分感谢。

weixin_38399962的博客 15万+

JVM创建对象

记录读《深入理解Java虚拟机》Chapter2 2.3节HotSport虚拟机对象探秘 读书笔记如下: Java类实例化的三种方式: 1 使用new关键字实例化; 2 使用Class.forName(classname).newInstance()实例化;【与1的区别?】 3 反序列化。 以new为例,在类实例化时,jvm会进行: 1 分配内存 检查new指令的参数是否能在常量池中

staticabc的专栏 577

面试官问HashMap和LinkedHashMap区别?别只答顺序,这3个底层细节才是关键

本文深入探讨了Java中HashMap和LinkedHashMap的三个关键底层差异,包括内存结构、迭代器性能及JDK8树化机制的不同表现。LinkedHashMap通过双向链表维护元素顺序,但带来额外内存开销和性能损耗,适合需要顺序访问或LRU缓存的场景,而不适用于高频更新或大数据量处理。

weixin_33713503的博客 171

Java面试笔试指南(三)---关键字

Java语言中的一些关键字

狮锅艺 558

各种问题答案

JAVA基础 JAVA中的几种基本类型,各占用多少字节? String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。 前者默认调用的是String.valueOf来返回

jnloverll的博客 6394
上一篇: JAVA--String str=““与new String()的区别
下一篇: 深入Java虚拟机之类加载
给自己加加油
博客等级 码龄8年 302粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值