java 静态块和构造块等执行顺序分析学习
来源:互联网 发布:mac 退出最大化 编辑:程序博客网 时间:2024/06/05 03:14
构造块:在类成员变量区域用大括号括起来的代码,和方法相比没有修饰,没有返回,没有参数;
静态块:在构造块前加 static修饰
静态代码块:静态块+静态变量
非静态代码块:普通类成员变量+构造块
程序执行顺序:静态代码块->非静态代码块->类构造方法
public class Test { static { System.out.println("静态块"); } { System.out.println("构造块"); } public Test(String str) { System.out.println("构造函数"+str); } public static void main(String[] strings) { Test t1 = new Test("t1"); Test t2 = new Test("t2"); } }
执行结果为:
静态块构造块构造函数t1构造块构造函数t2
也就是说静态块会先于main函数执行;(没有main函数,程序还能执行吗?)
然后是main里面实例化对象,这时程序会跳到构造函数那一行,但不会直接执行构造函数中的内容,而是开始执行非静态代码块,等执行完这一部分之后再执行构造函数;
还有一点,从结果可以看出静态代码块只执行了一次。
有一种特殊情况,静态对象
在静态变量中new一个自身的对象
public class Test { public static int k = 0; public static Test t1 = new Test("t1"); public static int i = print("i"); public static int n = 99; public int y=0; static { System.out.println("静态块"); } public int y1=0; public int y2=0; public int y3=0; public int y4=0; public int j1 = print("j1"); { System.out.println("构造块"); } public Test(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++i; ++n; } public static int print(String str) { System.out.println((++k) + ":" + str + " i=" + i +" n=" + n); ++n; return ++i; } public static void main(String[] strings) { Test t = new Test("init"); } }
执行结果:
1:j1 i=0 n=0构造块2:t1 i=1 n=13:i i=2 n=2静态块4:j1 i=3 n=99构造块5:init i=4 n=100
从结果中我们发现,”静态块“居然不是第一个输出,debug调试后发现执行顺序是
1.public static int k = 0;
2.public static Test t1 = new Test("t1");
3.public Test(String str) //构造函数,但不执行里面的内容
4.public int y=0;
5.public int y1=0;
...
6.public int j1 = print("j1");
7.System.out.println("构造块");
8.public Test(String str) { ...}//构造函数里面的内容
确实是先执行了静态块,不过遇到静态变量时
程序会先跳到构造函数,但不执行里面的内容,然后开始执行非静态代码块(注意 public int y=0; 也是非静态代码块中的一份子)
然后执行构造函数
所以才会出现了这样的结果
以下是执行顺序,抽之间重新画一下
以下是阿里的一到面试题
比上面的多一个地方
静态块和构造块中内容都是输出,在构造块之后又new了一个t2对象
不过没有关系,用上面的分析依然可以得到结果
public class Test { public static int k = 0; public static Test t1 = new Test("t1"); public static int i = print("i"); public static int n = 99; static { print("静态块"); } public int j1 = print("j1"); { print("构造块"); } public int j = print("j"); public static Test t2 = new Test("t2"); public Test(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++i; ++n; } public static int print(String str) { System.out.println((++k) + ":" + str + " i=" + i +" n=" + n); ++n; return ++i; } public static void main(String[] strings) { Test t = new Test("init"); } }
结果为:
1:j1 i=0 n=02:构造块 i=1 n=13:j i=2 n=24:t1 i=3 n=35:i i=4 n=46:静态块 i=5 n=997:j1 i=6 n=1008:构造块 i=7 n=1019:j i=8 n=10210:t2 i=9 n=10311:j1 i=10 n=10412:构造块 i=11 n=10513:j i=12 n=10614:init i=13 n=107
第一行输入代码为
public int j = print("j");
-->System.out.println((++k) + ":" + str + " i=" + i +" n=" + n);
这里输出了i的值为0,根据上面的分析,变量i的初始化即
public static int i = print("i");
这一行还没有执行到,那为什么不报错呢?
- java 静态块和构造块等执行顺序分析学习
- java 中的静态块 构造方法 等的执行顺序
- 静态代码块—构造块等执行顺序
- Java中构造函数、构造代码块、静态代码块等的执行顺序问题
- Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
- Java static属性和静态代码块和构造方法等的执行顺序探讨
- Java 静态块 、构造块、构造函数执行顺序
- java 静态块 非静态块 构造方法 执行顺序
- JAVA 构造函数,静态块,非静态块执行顺序
- java静态代码块和构造方法执行顺序
- java静态代码块和构造方法执行顺序
- java静态代码块和构造方法执行顺序
- java 静态代码块和构造方法执行优先顺序
- Java静态代码块和构造方法执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- java 静态代码块 代码块 构造函数执行顺序
- 广州临时仓库出租,专业仓储,租期灵活-龙森物流
- Python核心编程 练习 第八章
- 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
- IOS画图库 - Core Graphics/QuartZ 2D 和OpenGL ES
- perl实现大小写字母混排用于生成字典
- java 静态块和构造块等执行顺序分析学习
- gearman 分布式系统学习 python
- linux 命令收集
- 智能指针
- amazon s3 学习 python
- Gentoo 下载Android源码
- 从B树、B+树、B*树谈到R 树
- 动态缓存
- python对文件的几大基本操作