静态初始化--我的理解

Java中实例初始化和静态初始化的过程 Java代码初始化块是Java语言中的一个非常重要的概念。初始化块负责在创建对象时进行一些必要的操作,例如设置对象的初始状态、初始化成员变量等。初始化块被分为实例初始化块和静态初始化块两种类型。实例初始化块是在创建对象时执行的,每次创建新对象时都会执行。实例初始化块用于执行一些在对象创建时需要进行的操作,例如初始化实例变量。静态初始化块是在类加载时执行的,仅仅执行一次,并且是在类构造器调用之前执行的。静态初始化块用于进行一些在类加载时需要进行的操作,例如初始化静态变量。 阅读详情

首先要明确的是,所有的初始化都是运行时完成的。

0) int g;
1) int global = rand();
2) const int ci = 5;

3) struct test
4) {
5)  test() : i_(10) {}
6)  int i_;
7) };

8) test global_object;

9) void fun()
10) {
11)  int local;
12)  int local2 = 100;
13) }

14) int main()
15) {
16)  fun();
17)  static int si;
18)  return 0;
19) }


11 行的local是程序运行到fun()函数中,在stack中分配的,local2同样如此,但它已经初始化为100,有值。
这样的初始化可以视之为“动态初始化”,只有运行到fun()函数,才会初始化,而对于程序中所有的global,static object( include variable)来说,只要程序开始运行,它们都必须初始化好了,这个过程你是不知道的,你只要知道,无论在你的程序的哪个地方,都可以放心的使用它们,绝不会出现access violation。:),故称之为“静态初始化”。

这种数据会放在.exe文件的三个节中。.data(已经初始化的数据), .rdata(只读初始化的数据), .bss(没有初始化的数据),注意:普通临时变量是不会出现在EXE文件中的。由于C++会初始化所有的你没有初始化的数据为0,如上面的0行,所以只牵涉.data,.rdata两个节,bss用于C。

如何实现静态初始化,这个问题太过复杂,我也无法做出高深的解释,简述如下。

__sys_main()
{
 __sti();
 main()
 __std();
}

__sti()中负责执行静态初始化,(在本例中是0,1,2行)然后调用你提供的main(),最后__std()为对象调用dtor。这只是一个思路,并不代表编译器就这样实现。

上例中,0行g以0值放入.data,1行global也是以0值(无法在编译时求值)放入.data,2 行ci是以值5放入.rdata,8 行global_object是以0值放入.data,真正需要在__sti()出现的是ci和test::test(),其它的在程序运行时,EXE文件映象中已经是正确的值。

可以看出,在C中是不需要静态初始化这一过程的,要么只能是常量(编译时求值)(这是C的要求),要么就没有初始化。

(为了提高效率,standard C++ 要求,static object的初始化在其所在函数运行时才开始,似乎也成了“动态”,:)
但它的释放则必须在__std()中).

Java继承的初始化顺序:深入理解父类与子类的静态/实例初始化过程 本文深入探讨了Java中父类与子类的静态和实例初始化过程,强调了继承关系中初始化顺序的重要性。静态初始化在类加载时执行,包括静态变量和静态代码块;实例初始化在每次创建对象时执行,包括实例变量、实例代码块和构造方法。在继承关系中,初始化顺序遵循父类到子类的规则,静态内容先于实例内容初始化。文章通过代码示例、流程图和表格详细展示了初始化顺序,并分析了特殊情况如静态变量依赖子类和构造方法中调用可重写方法的陷阱。最后,通过数据对比表格总结了静态初始化与实例初始化的特性、不同情况的初始化顺序以及初始化陷阱与解决方案, 阅读详情

相关推荐

深入理解Java静态与实例初始化块

本文详细探讨了Java中的静态初始化块和实例初始化块,解释了它们的执行顺序、限制以及如何处理异常。静态初始化块在类加载时执行,而实例初始化块则在对象创建时执行。文章通过示例代码解释了前向引用的规则,以及如何在初始化块中处理异常,包括检查型异常和非检查型异常。同时,还讨论了在匿名类中使用实例初始化块的特殊用法。

weixin_35509395的博客 339

静态初始化程序(static initializer)

以前看过书上这样的写法。还不是很清楚为什么,今天在看了一遍《headfirst Java》才终于算是明白了。 正如静态变量,静态初始化程序(static initializer)是一段在加载类时会执行的程序代码,它会在其他程序可以使用该类之前就执行,所以很适合放静态final变量的起始程序。 public class Hello { private final static

925

基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,通过建立PMSM非线性状态空间模型,设计IOL控制器将系统转化为线性输入-输出映射。文章包含系统原理推导、Simulink建模步骤、参数整定方法和仿真结果分析,验证了IOL在高动态、宽速域工况下的优越性能(转矩误差降低90%)。最后提出了工程实现要点和扩展应用方向,为开发高精度电机驱动系统提供了实用指导。

xiaoheshang_123的博客 304

静态初始化

1. 静态代码块 一个类中可以使用不包含在任何方法体中的静态代码块(static block),当类被载入时,静态代码块被执行,且只被执行一次,静态代码块经常用来进行类属性的初始化。 2. static块通常用于初始化static(类)属性 3. 非静态代码块 类似于的不带参数的构造器,每次都被执行。 4. 参考资料 static静态代码块与非静态代码块 + 构造函数 博...

海边拾贝seebit 4394

伺服电机的位置控制模式:PP模式与CSP模式的比较

在轮廓位置模式下,上位机给定目标绝对位置(或相对位置)、速度、加速度等参数,伺服内部的轨迹发生器根据这些参数生成目标位置曲线指令,通过伺服驱动器内部实现三环控制(位置环、速度环、力矩环)。如果还不理解,不妨看看下面的类比:轮廓位置模式中,上位控制器对伺服电机说,我给你个位置,怎么去哪,走那条路,那是你自己的事,这个时候伺服电机是有自己的思想的。同期同步位置模式红,上位机控制器对伺服电机的管理就和 严格,除了告诉你目标位置,走那条路都是控制器说的算,伺服电机就是个没有灵魂的工具。重点关注,轮廓位置模式。

m0_49968063的博客 5805

科研指南:IEEE期刊LaTeX/Word模板下载与使用全解析

本文详细解析了IEEE期刊LaTeX/Word模板的下载与使用技巧,帮助科研人员高效完成论文排版。从官方模板获取入口到LaTeX文档结构配置,再到Word样式管理与常见问题解决方案,全面覆盖投稿准备的关键步骤。特别针对数学公式、参考文献和图片处理等难点提供实用建议,助力学术写作规范化。

weixin_28396629的博客 566

静态变量初始化

静态变量的初始化分为两个过程,一个是静态初始化,一个是动态初始化。 静态初始化在系统加载后执行第一条语句之前就已经完成。所以,可以认为所有的静态初始化过程是同步完成的。 动态初始化,则在main函数之前完成,对于同一个编译单元内的静态变量,动态初始化顺序等同于定义顺序,而对于跨编译单元的静态变量,初始化顺序未定义。 静态数据有两种:已初始化数据和未初始化数据。 在映像文件里,它们分别被放入 data 段和 bss段。只有 data 段的已初始化的数据才会真正被放入映像文件。 int a=5;//data 段

码农练功房的博客 5073

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载)

本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。

weixin_29223603的博客 388

静态数据的初始化

上篇文章提到在类定义时就会对类中的属性进行初始化,那么假如类中存在静态属性和方法,初始化是否还跟上篇文章所提到的一样呢? 看这篇文章时可以先理解上篇文章的内容:(17条消息) 在类中定义时就被初始化的域与通过构造方法初始化的域有什么区别?_Chen+7的博客-优快云博客 package Initialize; class Bowl{ Bowl(int marker){ System.out.println("Bowl("+marker+")"); } void

Chenhaozhi的博客 969

产品经理必备知识——API接口

在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如果你选择允许,app就会根据你的当前位置为你提供更加个性化的一些服务,当然也有一些app拿到你的位置信息做出损害用户利益的行为,所以还是需要谨慎授权。首先,看接口文档的场景一般是自身业务模块需要获取外部的数据,但又不想自己重新开发,寻找外部已经实现的有开放能力的供应商(包含企业内部的)。通过发送请求和响应消息的方式实现程序间的通信。

WBKJ_Noah_的博客 3455

STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

m0_74651303的博客 1595

jAVA中静态初始化块、初始化块和构造方法的理解

在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。 非静态初始化块: 作用:给对象进行初始化。对象一建立就运行,且优先于构造函数的运行。 与构造函数的区别:非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化。 应用:将所有构造函数共性的东西定义在构造代码块中。 静态初

4642

2026华为OD机试(JavaScript)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,JavaScript实现。

MISAYAONE的博客 8万+

java中静态初始化块、初始化块和构造方法的理解

在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。 非静态初始化块(构造代码块): 作用:给对象进行初始化。对象一建立就运行,且优先于构造函数的运行。 与构造函数的区别:非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化。 应用:将所有构造函数共性的东西定义在构造代码块中。

一只咸鱼的博客 391

HotSpot G1 GC 的分区记账、SATB 并发标记与停顿目标调优解析

线上GC毛刺该调停顿目标、加大新生代还是换收集器?本文从HotSpot G1的设计出发,梳理分区与巨型对象、卡表与记忆集、写屏障与细化线程、停顿预测、SATB并发标记、自适应IHOP、混合回收规则及Full GC兜底,并注明JDK8至JDK27的版本差异。文中在JDK8与JDK17上实测:停顿目标从200ms降到20ms,伊甸区缩小四成、P99下降但仍超目标;巨型对象会反复触发又撤销并发标记;JDK17并行Full GC平均停顿约为JDK8的三成。最后给出日志解读、参数清单、调优流程与选型。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 170万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

理解Java中的数组和静态初始化

数组是Java中的基本数据结构之一,允许存储和组织相同数据类型的一系列元素。它们提供了一种有效的方式来处理相似值的集合,并在编程中被广泛使用。在本博客文章中,我们将深入探讨数组的概念并探索静态初始化的技术。数组是一个容器,它包含一组固定大小的元素,每个元素由索引或键标识。数组中的所有元素必须是相同的数据类型。数组的大小在创建时确定,不能更改。数组中的元素使用它们的索引访问,通常从0开始。数组通常用于存储变量的集合,使其成为有效处理大型数据集的工具。

Windsky_jxj的博客 777

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java中静态初始化块、初始化块和构造方法的理解 (转载)

在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。 非静态初始化块(构造代码块): 作用:给对象进行初始化。对象一建立就运行,且优先于构造函数的运行。 与构造函数的区别:非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化。 应用:将所有构造函数共性的东西定义在构造代码块中。

wghq1的博客 185

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

理解初始化块和静态初始化块案例

初始化块的使用分析: 一个类里可以有多个初始化块; 如果一个类里定义了两个普通初始化块,则前面定义的初始化块先执行,后面定义的初始化块后执行; 初始化块虽然也是Java类里的一种成员,但它没有名字,也就没有标识,因此无法通过类、对象来调用初始化块; 初始化块只能在创建对象时自动执行而且在执行构造方法之前执行。 静态初始化块     如果定义初始化块时使用了static修饰符,则这个初始

java程序员 1612

对java中静态初始化块的理解

下面就是一个静态块:static { }   静态块的特点是在类加载的时候就执行,先说一下类加载,一个程序要想运行,首先要把代码加载到内存中对吧?然后才能去和CPU交流,这是冯诺依曼计算机规定的。Java也是一样,java的.class字节码文件要想执行,首先也要加载到内存,由类加载器把字节码文件的代码加载到内存中,这一步就叫类加载,这是首先要进行的。 public class Tes

shanshan1yi的博客 715

静态初始化--我的理解 (转)

静态初始化--我的理解 (转)[@more@]首先要明确的是,所有的初始化都是运行时完成的。 0)int g;1)int global = rand();2)const int ci = 5; 3)struct te...

csd3176的博客 80

Java 初始化 代码块,深入理解Java中静态初始化块、初始化块和构造方法

在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。非静态初始化块(构造代码块):作用:给对象进行初始化。对象一建立就运行,且优先于构造函数的运行。与构造函数的区别:非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化。应用:将所有构造函数共性的东西定义在构造代码块中。对于普通的类而言,可...

weixin_33137081的博客 337

完全理解Java中静态代码块,静态方法,静态变量,非静态代码块,非静态变量,构造函数初始化顺序

一、定义 1、静态代码块(静态初始化块,静态域): 使用static关键字和{}声明的代码块,格式如下: public class People{ static{ System.out.println("静态代码块"); } } 作用: 需要在项目启动时就执行的代码,一般放在静态代码块中。比如一个项目启动时需要加载大量的配置文件,静态资源等信息。并且静态代码块指初始化一...

JSai的博客 5001
下一篇: [深度探索C++对象模型](简体版)中的蛇足
招RD和QA
博客等级 码龄26年 40粉丝 34原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值