静态初始化--我的理解

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

DataWorks数据安全治理最佳实践

DataWorks基于数据安全治理的常见思路,针对资产梳理、技术体系建设和运营体系建设,提供了一系列数据安全产品能力,您可通过“基础防护建设、数据安全防护措施及策略增强建设、数据安全持续运营”三个阶段在DataWorks上落地数据安全治理项目。参考本文启动数据安全治理项目前,建议您先了解DataWorks数据安全产品相关能力了解DataWorks数据安全产品能力后,您可参考如下三个阶段在DataWorks上落地数据安全治理项目。

soso1968的博客 1438

静态初始化

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

海边拾贝seebit 4394

数据中心机房设备标签规范建议

机房的维护工作中,标识管理是极其重要的一部分,从基本的线缆上跳接信息的标识,到设备、机柜标识规范的实施,不同程度的体现了标识管理的重要作用。本规范适用于机房主设备、线缆、机柜(含PDU插排)、仪器仪表、动力配套设备(各类空调、消防设备、配电柜、UPS等设备)、网络口、电源插座口的标签、标识规定。动力设备的设备编号、设备名称、生产厂商及厂商技术支持热线、设备型号、设备序列号、设备使用部门、设备责任人、设备启用时间及设备保修年限、条形码。各类标签、标识可根据设备和机柜的尺寸、大小进行调整。

有地气的强弱电小圈子 3525

NT35310 - LCD显示屏

NT35310 是一个低功耗、26 万色、单芯片的 TFT-LCD 控制器/驱动器,分辨率 480*320,它有一个 345600 字节的显示 RAM 和一整套控制功能。NT35310 支持数字接口(MDDI),MIPI 接口,RGB 接口,8 / 9 / 16 / 18 位8080 接口。可以实现指定的窗口区域可以有选择地更新,以便可以显示运动图像。同时也可以独立显示静止的图像区域。...

m0_62444125的博客 3321

静态变量初始化

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

码农练功房的博客 5073

【代码审计】RuoYi定时任务漏洞:从SQL注入到RCE的攻防演变

本文深入剖析了RuoYi框架定时任务模块从早期版本无校验到引入黑白名单机制,再到被组合利用实现RCE的完整漏洞演变过程。文章详细分析了SQL注入与定时任务功能结合导致的远程代码执行漏洞,并总结了代码审计与安全开发的核心要点,为开发者提供了重要的安全参考。

yellow的专栏 699

静态数据的初始化

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

Chenhaozhi的博客 969

多模型对抗性审查:用AI辩论提升技术文档质量

在软件工程领域,技术文档是团队协作和项目成功的关键基础。传统的文档评审依赖人工经验,存在盲区和效率瓶颈。通过引入多模型对抗性审查机制,不同大语言模型从各自视角对文档进行批判性分析,模拟现实中的专家评审过程。这种技术方法的核心价值在于利用模型间的思维差异,自动发现单个视角容易忽略的边界情况、逻辑漏洞和隐含假设。在应用场景上,特别适合产品需求文档和技术规格书这类需要多角度审视的复杂文档。adversarial-spec工具通过Claude协调多模型辩论,实现从概念到实现的完整文档质量保障,显著提升文档的完整性和

weixin_42531579的博客 379

将任意文件转换为Pcap网络数据包传输

一款实用的工具用于将任意文件转换为pcap网络数据包

村中少年的专栏 3188

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

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

4642

化工仿真软件:gPROMS二次开发_(1).gPROMS基础知识

在gPROMS中,模型是通过定义变量、参数和方程来创建的。模型可以是简单的单元操作,如换热器、反应器,也可以是复杂的系统,如整个化工流程。变量是模型中表示状态或输出的量。在gPROMS中,变量需要显式定义其类型和单位。# 定义变量VAR# 温度变量,单位为K# 压力变量,单位为Pa# 组分摩尔分数,数组变量参数是模型中表示常量或初始条件的量。参数同样需要定义其类型和单位。# 定义参数PAR# 理想气体常数,单位为J/(mol·K)# 反应器体积,单位为m^3# 初始摩尔数。

kkchenjj的博客 617

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

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

一只咸鱼的博客 391

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

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

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

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

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

Windsky_jxj的博客 777

NTscan扫描工具

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

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

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

wghq1的博客 185

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

初始化块的使用分析: 一个类里可以有多个初始化块; 如果一个类里定义了两个普通初始化块,则前面定义的初始化块先执行,后面定义的初始化块后执行; 初始化块虽然也是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、付费专栏及课程。

余额充值