Static、构造代码块快、构造函数等的执行顺序

版权声明:本文出自孤星卟哭的博客,原创文章,转载请注明出处。 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

猜你喜欢

转载自blog.csdn.net/zcy92949/article/details/80054479