类的初始化

C++类初始化列表 作用: C++提供了初始化列表语法,用来初始化属性 语法:构造函数():属性1(值1),属性2(值2)... {} 示例: class Person { public: ////传统方式初始化 //Person(int a, int b, int c) { // m_A = a; // m_B = b; // m_C = c; //} //初始化列表方式初始化 Person(int a, int b, int c) :m_A(a), m_B(b), m_C(c) {} void Pri 阅读详情

类的初始化

     参考:http://m.blog.youkuaiyun.com/article/details?id=17845821

 

类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化:

1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法时。

2、使用Java.lang.refect包的方法对类进行反射调用时,如果类还没有进行过初始化,则需要先触发其初始化。

3、当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。

4、当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类。

5、虚拟机规定只有这四种情况才会触发类的初始化,称为对一个类进行主动引用,除此之外所有引用类的方式都不会触发其初始化,称为被动引用。

 

下面举一些例子来说明被动引用:

1、通过子类引用父类中的静态字段,这时对子类的引用为被动引用,因此不会初始化子类,只会初始化父类

class Father{

public static int m = 33;

static{

System.out.println("父类被初始化");

}

}

 

class Child extends Father{

static{

System.out.println("子类被初始化");

}

}

 

public class StaticTest{

public static void main(String[] args){

System.out.println(Child.m);

}

}

执行后输出的结果如下:

父类被初始化
    33

 

总结:对于静态字段,只有直接定义这个字段的类才会被初始化,因此,通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。

 

 

2、常量在编译阶段会存入调用它的类的常量池中,本质上没有直接引用到定义该常量的类,因此不会触发定义常量的类的初始化

class Const{

public static final String NAME = "我是常量";

static{

System.out.println("初始化Const类");

}

}

 

public class FinalTest{

public static void main(String[] args){

System.out.println(Const.NAME);

}

}

执行后输出的结果如下:

    我是常量

 

总结:虽然程序中引用了const类的常量NAME,但是在编译阶段将此常量的值“我是常量”存储到了调用它的类FinalTest的常量池中,对常量Const.NAME的引用实际上转化为了FinalTest类对自身常量池的引用。也就是说,实际上FinalTest的Class文件之中并没有Const类的符号引用入口,这两个类在编译成Class文件后就不存在任何联系了。

 

 最后看一下接口的初始化过程与类初始化过程的不同:

    接口也有初始化过程,上面的代码中我们都是用静态语句块来输出初始化信息的,而在接口中不能使用“static{}”语句块,但编译器仍然会为接口生成<clinit>类构造器,用于初始化接口中定义的成员变量(实际上是static final修饰的全局常量)。

  

二者在初始化时最主要的区别是:当一个类在初始化时,要求其父类全部已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量),才会初始化该父接口。这点也与类初始化的情况很不同,回过头来看第2个例子就知道,调用类中的static final常量时并不会触发该类的初始化,但是调用接口中的static final常量时便会触发该接口的初始化。

 

 

 

问题1:常量在编译阶段会存入调用它的类的常量池中,本质上没有直接引用到定义该常量的类,因此不会触发定义常量的类的初始化。
如现在将常量类型改为Integer包装类修饰,刚会打印静态内容,何解?

 

因为调用了getstatic。建议 自己动手使用 javac编译,
使用javap -v 查看class类中的虚拟机码。可能会更形象。

通过javap -v命令可以看到类的字节码的虚拟代码。


Java中的初始化顺序

1、对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是

(静态变量、静态初始化块)>(变量、初始化块)> 构造器。

 

2、JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。

 

3、初始化顺序:先初始化父类的静态代码--->初始化子类的静态代码-->

(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码(变量定义等)--->初始化父类构造函数--->初始化子类非静态代码(变量定义等)--->初始化子类构造函数

 

4、类只有在 使用New调用创建的时候才会被JAVA类装载器装入创建类实例时,首先按照父子继承关系进行初始化类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法类消除时候,首先消除子类部分,再消除父类部分.

 

5、并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。




第3章 zynq MII转GMII的配置和EMIO UART0的配置 本文介绍了在Vivado工程中实现MII转GMII接口适配的过程,同时配置EMIO UART0接口。主要内容包括:修改PS IP核添加UART0接口,使用concat IP核进行信号整合,调整GMII信号引脚连接,添加约束文件定义引脚映射,并最终生成bit流文件。通过详细的操作截图和TCL约束代码,展示了从硬件配置到生成可编程文件的完整流程,为Zynq平台开发提供了实用参考。 阅读详情

相关推荐

VINS技术路线与代码详解

VINS技术路线 写在前面:本文整和自己的思路,希望对学习VINS或者VIO的同学有所帮助,如果你觉得文章写的对你的理解有一点帮助,可以推荐给周围的小伙伴们,当然,如果你有任何问题想要交流,欢迎随时探讨。话不多说,下面上正文。 VINS代码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono 参考文档:1.VINS-Mono A R...

wangshuailpp的博客 7万+

java学习笔记——初始化块(代码块)

初始化块是java类中可以出现的第四种成员(前面包括属性、方法、构造器)。 一个类中可以有多个初始化块,相同类型的初始化块按顺序执行。初始化块要么不写修饰符,要么用static修饰,用static修饰的叫静态代码块。代码块里可以包括任何可执行语句。 普通初始化块、声明实例属性值都可以被认为是对象的初始化代码。初始化块在创建对象时隐式地执行,在构造器之前执行。与构造器类似的是,系统会一直上溯到O...

blue_space的博客 1804

prometheus 从入门到精通(史上最全)

Prometheus(由go语言开发)是一套开源的监控&报警&时间序列(按照时间排序)数据库的组合。因为kubernetes(俗称k8s)的流行带动了prometheus的发展。它可以监控主机,服务,容器,支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。原文链接:https://blog.youkuaiyun.com/qq_45277554/article/details/130917620时间序列数据。

流水_鱼鱼的博客 1万+

一分钟带你了解类的初始化

一、首先来看看类的构成 写主方法 作用:运行(可选的) 成员变量 作用:公共资源(可选的) 普通方法 作用:公共资源(可选的) 局部变量 作用:辅助运算(可选的) 构造方法 作用:new对象(必须的且默认存在) 内部类 (可选的) 匿名内部类 (可选的) 静态代码块 (可选的)(拥有最高的优先级) ...

不会飞的王 3781

zynq 7010/020 AMP双核通信-Vitis2023/2024

在platform cpu1设置中添加;注意value中使用空格分开程序思路:比较简单。

weixin_43310175的博客 916

AMESim柱塞泵建模全指南:从HCD库搭建到联合仿真

液压系统仿真中,轴向柱塞泵的建模始终是难点与热点。柱塞泵结构紧凑、功率密度高,在工程机械与航空航天领域应用广泛,然而其运动学与流体细节深度耦合,给仿真带来不小挑战。AMESim平台中的HCD库提供了一种从物理结构出发的建模思路,将柱塞泵分解为容积腔、节流口与机械约束等基础单元,从而真实刻画柱塞腔压力波动、配流特性和容积效率等关键行为,摆脱黑盒模型的局限。基于机理建模的仿真结果,可用于泵参数优化、故障特征分析以及控制策略验证。进一步结合AMESim与Simulink联合仿真,可以高效开发变量泵排量控制系统,研

weixin_29159441的博客 288

类初始化流程

一、类的初始化顺序(静态变量、静态初始化块:决于它们在类中出现的先后顺序)&gt;(变量、初始化块:决于它们在类中出现的先后顺序)&gt;构造器 原理: 1、加载类信息。在实例化对象之前,类的装载器会找到需要加载的类class文件,进行类的加载(有父类的会先加载父类),一旦加载到最根上的基类,就会对基类的静态变量和静态初始化块进行初始化; 2、当所有类信息加载完毕就会执行main()主方法,然后执...

l1394049664的博客 4186

华为海思:大小海思的双轮驱动战略分析

大海思的定位清晰明确,即专注于为华为内部提供高性能、高集成度的芯片解决方案,以支持华为终端、服务器等业务的快速发展。小海思的产品线广泛,涵盖了广域物联、短距物联、手机穿戴、显示交互、智慧视觉、智慧媒体、MCU、模拟以及光模块等多个领域。通过提供多样化的芯片解决方案,小海思旨在满足外部客户的不同需求,拓展华为海思在芯片市场的份额和影响力。大海思的产品布局主要围绕华为的内部需求展开。在智能手机应用处理器方面,大海思的麒麟系列芯片已经成为华为手机的标志性产品,以其出色的性能和能效比赢得了市场的广泛认可。

dream it possible 2922

类初始化过程

1、类初始化过程 1、一个类要创建实例需要先加载并初始化该类; main方法所在的类需要先加载和初始化; 2、一个子类要初始化需要先初始化父类; 3、一个类初始化就是执行()方法; ()方法由静态类变量显示赋值代码和静态代码块组成; 类变量显示赋值代码和静态代码块代码从上到下顺序执行; ()方法执行一次; **<clinit>()是在编译器编译代码时自动添加的。 ** 2、实例初始化过程 1、实例初始化就是执行方法; ()方法可以重载多个,一个构造器对应一个()方法; ()方法由非

weixin_45295678的博客 2340

把 ABAP 接到外部世界的几条路, 从 Web Service 到 RFC、BAPI 与 IDoc 的完整理解

摘要: ABAP 的连接能力是其长期成为企业核心的关键,不仅支持通用协议(HTTP、SOAP、XML),还保留了 SAP 特有的技术(RFC、BAPI、IDoc)。Web Service 是跨系统通信的主轴,依赖 SOAP/WSDL 实现契约化协作,而 Enterprise Service 更强调业务语义的复用与治理。经典技术如 RFC 和 BAPI 因高效稳定仍广泛使用,尤其适合紧耦合场景。ABAP 通过分层工具箱(如代理生成、服务注册)实现灵活集成,平衡新旧技术,满足多样化的企业连接需求。 (字数:15

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

STM32F4 Flash数据的保存和读取。

STM32F4 Flash数据的保存和读取。

张一西的博客 9216

java类初始化_Java类的初始化

Java类的初始化我们知道一个类(class)要被使用必须经过装载,连接。初始化这种过程。以下先对这三阶段做一个简单的描写叙述。之后会结合一个简单的样例来说明java中类的初始化过程。在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自己定义的ClassLoader) 把编译形成的class文件加载内存。创建类相关的Class对象,这个Class对象封装了我们要使用的类的类...

weixin_42401178的博客 2722

《UDS协议从入门到精通》系列——图解0x19:读取故障码信息

认识最核心的诊断服务“0x19”!!全网最强图解!一文搞懂所有常用子服务!

车载系统攻城狮 1万+

java 类的初始化

Java类的初始化   我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。   在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装

KevinJom的专栏 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STM32F407中文手册

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

类初始化

主动引用类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段(

戎码人生 4846

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

类的初始化详解

​ 类的成分包括成员变量,方法,构造器,代码块,内部类。除此之外,类还可以继承一个父类,这就让类的成分显得十分丰富。这么丰富的成分,如果在类加载的过程中初始化顺序没有严格的规定,就极有可能出现相同类每次初始化值不相等的情况。所以类的初始化一定是有顺序的,那么在类初始化过程中,它们的初始化顺序是怎么样的呢? ​ 先看下面代码: /* 父类 */ class SuperClass { /* 静态变量 */ public static String supStaticVariable = "

weixin_50405727的博客 4484

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java类的初始化

Java类的初始化   我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。   在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这

Java 攻城狮~~ 1497

类和对象的初始化

类的初始化 1)类的初始化阶段是类加载过程的最后一个步骤。 ​ 类加载过程即加载、 验证、 准备、 解析和初始化。 2)直到初始化阶段, Java虚拟机才真正开始执行类中编写的Java程序代码, 将主导权移交给应用程序。 3)**根据程序员的要求去真正初始化类变量和其他资源。**和前面准备阶段不一样。 4)初始化阶段就是执行类构造器**< clinit >()方法**的过程。 < clinit >()方法介绍: 1)所有的类变量初始化语句(显示赋值)和类型的静态初始化器 ​ 在

qq_45485626的博客 1462

C++中类的初始化

这是《C++primer》的笔记和总结,在C++的类中,用来初始化类中的成员的方式多种多样,常常是依据这些变量的特性来决定的,比如const、static以及引用等类型。这里说的是最普通的初始化方式,估计用的也最少,是继承自C语言中的初始化机制。 在C语言中,一个数组的初始化可以写成这样: int arr[5] = { 0 }; #include <iostream> #in...

OtherShoreFlower的博客 2883

Java 类初始化

类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的 Java 程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的 Java 代码场景是:使用 new 关键字实例化对象时、读取或设置一个类的静态字段(static)时(被 static 修饰又被 final 修饰的,已在编译期把结果放入常量池

暮同学的博客 322

类的初始化以及实例化

在类的初始化阶段,虚拟机对类进行初始化,主要对类变量进行初始化。在java中对类变量进行初始化有两种方式: ①声明类变量时指定初始值 ②使用静态初始化块为类变量指定初始化值 声明变量时指定初始值,静态初始化代码块**都被当成类的初始化语句**,他们无先后关系,谁写在前面就先初始化谁。 如果没有在这种方式中对类变量进行显式初始化,他将采用默认初始值(类准备阶段实现)。如下面a=5,b=6,c=0. (这里可以先了解类的声明周期https://zhuanlan.zhihu.com/p/67991761) p

qq_45382625的博客 4062

类初始化和实例初始化

    一、类初始化过程 1.一个类要创建实例需先加载并初始化该类 (1)、main方法下的类需要先加载和初始化  (2)、一个子类初始化需要先初始化他的父类 (3)、一个类初始化就是执行&lt;clinit&gt;  ()方法        说明: &lt;clinit&gt;  ()方法由静态变量显示赋值代码和静态代码块组成,静态变量显示赋值代码和静态代码块从上到下顺序执行,&l...

qq_31275085的博客 2606
上一篇: Memcached基础整理
下一篇: 通过反编译深入理解Java String及intern(笔记整理二)
马克吐温
博客等级 码龄10年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值