版权声明:本文出自孤星卟哭的博客,原创文章,转载请注明出处。 https://blog.csdn.net/zcy92949/article/details/80054479
前言
今天分享的是关于在程序中代码的执行顺序,零零散散写了很多随记,总结起来蛮费时间的,希望大家给个关注,多多关注新人哈,废话不多说,还是老规矩,代码穿插注释的总结方式。
1、代码执行顺序
/**
* 这道题还是蛮复杂的,如果这道题理解了,基本以后遇到的大部分代码执行顺序问题都会迎刃而解
*
* 关于执行顺序的一些笔记:
* 1.静态块:用static申明,JVM加载类时执行,仅执行一次;
* 2.构造块:类中直接用{}定义,每一次创建对象时执行;
* 3.两个类执行顺序优先级:父类的static成员变量 -> 子类的static成员变量 ->
* 父类的成员变量 -> 父类构造 -> 子类成员变量 -> 子类构造;
* 4.一个类执行顺序优先级:main()>静态块>构造块>构造方法;
* 5.static只会加载一次,所以通俗点讲第一次new的时候,所有的static都先会被全部载入
* (以后再有new都会忽略), 进行默认初始化。再从上往下进行显示初始化。静态代码块和静态
* 成员变量没有先后之分,谁在上,谁就先初始化;
* 6.a:静态代码块不能存在于任何方法体内;b:静态代码块不能直接访问静态实例变量和实例方法,
* 需要通过类的实例对象来访问。
*
* 解题思路:
* 关于这道题:首先会先执行main()方法,之后无论是静态整型变量还是整型成员变量都会初始化成零,
* 之后执行new StaticTest("init")创建对象,可是在此之前需要按照代码赋的值重新进行初
* 始化,顺序是从上到下,由此执行new StaticTest("t1"),可是在实例化构造函数之前,需要
* 先执行成员变量j的初始化,因此第一个输出:(1:j i=0 n=0),构造快的执行顺序又在构造方法之前,
* 因此第二个输出:(2:构造块 i=1 n=1),之后执行构造方法,因此第三个输出:(3:t1 i=2 n=2),
* 到此t1对象创建完毕,t2同t1,因此第四个输出:(4:j i=3 n=3),第五个输出:(5:构造块 i=4 n=4),
* 第六个输出:(6:t2 i=5 n=5),之后执行i的初始化,因此第七个输出:(7:i i=6 n=6),之后
* n变成99,之后执行静态代码块,因此第八个输出:(8:静态块 i=7 n=99),这是菜真正执行
* new StaticTest("init")创建对象t,可在实例化构造函数之前,需要初始化成员变量j,因此
* 第九个输出:(9:j i=8 n=100),第十个输出:(10:构造块 i=9 n=101),第十一个输出:
* (11:init i=10 n=102),到此结束。呼!!!
* @author isolated star
*
*/
public class StaticTest {
public static int k = 0;
public static StaticTest t1 = new StaticTest("t1");
public static StaticTest t2 = new StaticTest("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static{
print("静态块");
}
public StaticTest(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
return ++n;
}
public static void main(String[] args) {
new StaticTest("init");
}
}
上面的注释已经解释很清楚了,这也是我闲来无事看到的一个题,感觉还是挺有难度的,如果没做够的道友,不妨去”牛客网“刷刷题,那里关于这种类型的题还有很多。
接下来说一下每个代码块的作用:
- 局部代码快:限定变量生命周期,及早释放,提高内存利用率。
- 构造代码块:实际用处不大,主要是把所有构造方法中相同的内容都拿出来放在构造代码块中,因为在每次创建对象的时候,构造代码块都会优先构造方法先执行。
- 静态代码块:随着类的加载而加载,用来给类初始化,一般用来加载驱动(注:如果类中只有主方法和静态代码块,静态代码块会优先于主方法执行)。
- 同步代码块:用于多线程中。
2、总结
以上就是我对代码执行顺序的一些基本理解,如有不对之处,希望诸君不吝赐教。
我自己在学习java基础的时候也记录过十一个编码的小练习题,都有题目和答案,有兴趣的可以下载
https://download.csdn.net/download/zcy92949/10369030