构造代码块,静态代码块,局部代码块与new对象时,执行的次序

时间:2021-08-08 19:30:25

一. 代码块

概念:
使用{} 括起来的代码,称为代码块

分类:
根据它位置和声明的不同,我们可以将代码块分为局部代码块,构造代码块,静态代码块,同步代码块(多线程涉及)

a. 局部代码块

限定了变量的生命周期,变量在局部代码块中定义的,那么出来局部代码块之后,就访问不到了。在局部代码块中定义的变量,
在出了代码块之后,内存就会释放掉。

作用: 主要就是节约内存.

局部代码块中定义的变量,虽然说作用域是局部的,但是如果存在外部嵌套的代码块,且在局部代码块定义之前就定义了某个变量,
那么在我们局部的代码块中就不可以定义相同名称的变量。
但是如果在局部代码块执行之后,去定义一个和局部代码块中相同名称的变量,是可以的。因为局部代码块中的变量已经失去了作用域范围。

b.构造代码块

概念:
类中方法外出现,每次调用构造方法的时候,都会优先先调用构造代码块。

特点:
没创建一个对象,都会调用一次我们的构造代码块.

作用:
如果存在很多重载的构造方法,而且每个里面需要执行 相同的逻辑,那么就可以考虑将这些代码提取到构造代码块中来执行。
让我们代码结构更简练。增强了维护性.
使用场景其实不太多见。

c.静态代码块

概念:
类中方法外出现,但是用static 来进行修饰。

特点:
随着类加载的时候执行。

用处:
适用于整个软件的生命周期中,只需要执行一次的业务逻辑代码。
比如我们之后数据库的操作.

特别经典的一道面试题

//注意:静态代码也是按顺序随类的加载而执行的
package snippet;

public class Test {
    public static int w=0;
    public static int f=print("f");
    public static int nom=99;
    public static int s=print("s");
    public static Test d1 =new Test("d1");
    public static Test d2=new Test("d2");
    {
        System.out.println("构造快");
    }
    static{
        System.out.println("静态块");
    }

    public  Test(String str){
        System.out.println((++w)+":"+str+" f="+f+" nom="+nom);
         ++f;++nom;
    }
    public static int print(String str){
        System.out.println((++w)+":"+str+" f="+f+" nom="+nom);
        ++nom;
        return ++f;
    }
    public static void main(String[] args){
        Test d=new Test("init");
    }


}

构造代码块,静态代码块,局部代码块与new对象时,执行的次序