类里含有静态初始化对象的执行过程和顺序
来源:互联网 发布:软件测试就业培训 编辑:程序博客网 时间:2024/05/22 13:00
今天在做牛客网上的题时,注意到了一个题是关于静态对象的初始化的问题
之前发现类加载的顺序是 :
父类的静态代码块和静态对象->子类的静态代码块和静态对象->父类非静态代码块和对象->父类构造函数->子类非静态代码块和对象->子类构造函数
今天做这个题时,立马根据上面的顺序排出掉A和B,结果查看答案瞬间傻眼了,于是就自己在eclipse测试了一下
实验代码:
package com.xaut.cherry.niukewang0702;
public class StaticMethodConstructor { // (3) (9) (12)
static StaticMethodConstructor ex1 = new StaticMethodConstructor(); // (4)
{
System.out.println("block D"); //加断点处 (1) (10)
}
static{
System.out.println("block C"); // (5)
}
{
System.out.println("block A"); // (2) (11)
}
static {
System.out.println("block B"); // (6)
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(); // (7)
StaticMethodConstructor example = new StaticMethodConstructor(); // (8) (13)
} // (14)结束
}
为了看的明白,多写了几个静态代码块和非静态代码块
实验结果:
并且用debug进行调试,发现:
发现该段程序的执行顺序如右边标注的数字所示。
对于该类,首先执行的是两个非静态代码块,然后再进入该类,执行静态对象的定义和初始化,按顺序执行静态代码块,再到main函数里面先执行输出空行,再是一般对象的初始化,最后再执行两个非静态的代码块。
但是当我把类里面的定义静态对象那行注释掉之后,发现执行的顺序和最上面的那个顺序一致
实验结果:(// static StaticMethodConstructor ex1 = new StaticMethodConstructor();)
由上面的对比发现,如果一个类里面有静态的初始化的对象,则首先执行非静态代码块,然后再是静态代码块,之后的就和正常一样。注意静态代码块只执行一次。
- 类里含有静态初始化对象的执行过程和顺序
- Java 类和对象的初始化过程及初始化顺序
- Java 类和对象的初始化过程及初始化顺序
- 静态代码块的执行顺序(类中含有本类对象)
- 类的初始化过程及静态成员之间的执行顺序
- 对象初始化的执行顺序
- java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:
- 静态初始化块的执行顺序
- 例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序
- 简单测试java里一个对象的初始化是按怎样的顺序执行的
- 对象初始化执行顺序
- Java类和对象的初始化顺序
- Java类和对象的初始化顺序
- java所有对象初始化的执行顺序
- 类的初始化顺序:实例化一个类的对象和访问静态域或者静态方法时的不同
- JAVA 对象的初始化过程和类的初始化过程
- 【java】静态&初始化执行顺序
- java 静态初始化执行顺序
- java多线程协作(使用Condition)
- Andriod从网络上读入文件
- Kotlin-28.类型检查和转换(Type Cast)
- ES简介
- 组合模式
- 类里含有静态初始化对象的执行过程和顺序
- 位运算
- mac下安装python-lxml
- JS框架 获取页面传递过来的参数
- Itext笔记之pdf页眉页脚
- GNU Radio资料链接
- SQL Server 数据导入Mysql详细教程
- Mina框架实例
- 用Tomcat发布项目供外网访问