静态代码块,构造代码块,构造函数之间的差别及先后执行顺序

时间:2020-12-20 19:29:24

突然有点不清晰,那么就把他整清晰静态代码块,构造代码块,构造函数之间的差别及先后执行顺序

1.构造函数

这个不用多讲




2.普通代码块


普通代码块:在方法或语句中出现的{}就称为普通代码块。

普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”

说白了就是类中的方法的代码




3.构造代码快

//构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块执行次序优先类构造函数

相当于这个类的一些初始化动作

public class Text {
    {
        int x =1;
        System.out.println("xcqw 构造代码块1x"+x);
    }
    public Text() {
        System.out.println("xcqw text构造函数");
    }
    {
        int x =2;
        System.out.println("xcqw 构造代码块2x"+x);
    }
}


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Text text = new Text();
    }
}


//结果   构造代码块  每new一次就会执行
xcqw 构造代码块1x1
xcqw 构造代码块2x2
xcqw text构造函数


4 静态代码块

//静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。 每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
//如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
//注意:1 静态代码块不能存在于任何方法体内。2 静态代码块 不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问

public class Text {
    {
        int x =1;
        System.out.println("xcqw2 构造代码块1x"+x);
    }
    public Text() {
        System.out.println("xcqw2 text构造函数");
    }
    static{
        System.out.println("xcqw2 静态代码块");
    }
    {
        int x =2;
        System.out.println("xcqw2 构造代码块2x"+x);
    }

}

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Text text = new Text();
    }
}


结果:   静态代码块只会执行一次 不管 new几次对象都是一样

xcqw2 静态代码块
xcqw2 构造代码块1x1
xcqw2 构造代码块2x2
xcqw2 text构造函数


 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("xcqw oncreate");
        Text text = new Text();
        Text text1 = new Text();
    }

结果 : 可以看出静态代码块只执行了一次

//        xcqw oncreate
//        xcqw2 静态代码块
//        xcqw2 构造代码块1x1
//        xcqw2 构造代码块2x2
//        xcqw2 text构造函数
//        xcqw2 构造代码块1x1
//        xcqw2 构造代码块2x2
//        xcqw2 text构造函数


最终结果   :  

静态代码块(一次) 先于 构造代码块(new几次就有几次)  先于 构造函数(new几次就有几次)  先于普通代码块(每次调用方法都会调用)