Java 的初始化顺序
2024-10-19 12:50:30
初始化顺序:
1.将对象内存空间初始化为二进制0(所有的数据成员被设为默认值)
2.如果该类有基类则初始化其基类(调用默认基类构造器,也可在子类构造器中指定调用基类的某个构造器)
3. 静态成员和静态域(谁在前谁先初始化,且在内存中只占一份空间,同一个类不同对象可以共享)
4.main方法
5.非静态成员变量,引用,实例初始化 被初始化
6. 构造器
1,2,3,4为类加载过程,5,6为new对象过程,只有new会执行。
class A {
A() {
System.out.println("基类构造器");
System.out.println("证明数据成员被设为默认值");
draw(); } A(String s) {
System.out.println(s);
} void draw() {
System.out.println("A.draw()");
} } public class Test extends A { int i = 5; Test() {
System.out.println("子类构造器");
System.out.println("证明数据成员在构造器调用之前被初始化");
draw();
} String b = "非静态成员";
A a = new A(b + "与非静态引用"); {
A b = new A("实例初始化");
} String c = "非静态成员与实例初始化平级,谁在前先初始化谁";
A d = new A(c); void draw() {
System.out.println("i = " + i);
} static A start = new A("---类加载---");
static String e = "静态成员";
static A f = new A(e + "和静态引用"); static {
A g = new A("静态域");
} static String h = "静态成员与静态域平级,谁在前先初始化谁";
static A j = new A(h); public static void main(String[] args) { System.out.println("main执行");
System.out.println("---创建Test对象---");
Test k = new Test(); } }
输出结果:
---类加载---
静态成员和静态引用
静态域
静态成员与静态域平级,谁在前先初始化谁
main执行
---创建Test对象---
基类构造器
证明数据成员被设为默认值
i = 0
非静态成员与非静态引用
实例初始化
非静态成员与实例初始化平级,谁在前先初始化谁
子类构造器
证明数据成员在构造器调用之前被初始化
i = 5
总结:
所有静态成员是属于Class对象的,所有非静态成员是属于实例对象的,先加载Class对象在创建实例对象,所以先执行静态变量,在执行实例变量
- 注意: new A() 是A 的实例对象,也就是说所有非静态的成员都是属于new A() ,所有静态成员都是属于A.class 对象的, 但是如果 有2个静态成员按顺序分别是 static A a = new A ( ) 和static{ }那么 一定是先执行第一个静态成员 new A() ,所以属于new A()的非静态成员在 static{ }之前执行。
最新文章
- 利用nagios搭建打印机监控服务器
- PostgreSQL笔记
- 奇怪吸引子---ShimizuMorioka
- buildbot 自动启动
- Connection对象连接加密2
- Js popup position which right under target item
- 第十二篇、高度自适应的textView
- 【JSP】JSTL核心标签库的使用方法和示例
- git分支--branch
- doubango简介
- C++11 中的function和bind、lambda用法
- 安装pytorch0.4.0
- API 开发平台 dreamfactory,参考SAWAGGER,国外厂家,开源,本地与云部署
- Go指南练习_图像
- css列表list、表格table
- Android - Resource 之 Menu 小结
- JVM调优推荐
- jar 命令详解
- MySql8.0数据库链接报错The driver has not received any packets from the server
- Matlab 矩阵函数
热门文章
- linux备忘录-日志档案
- linux下easy_install的安装与使用详解
- 软工实践Beta冲刺(1/7)
- 正则匹配java多行注释
- 【转】GOOGLE-PROTOBUF与FLATBUFFERS数据的序列化和反序列化
- jQuery添加、移除、改变class属性
- BZOJ5323 [Jxoi2018]游戏 【数论/数学】
- BZOJ1452 [JSOI2009]Count 【树套树 (树状数组)】
- CSS3边框会动的信封
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) B