Java SE 代码块
1、代码块
- 
基本语法
- 
[修饰符]{
代码
};
- 修饰符 可选,要写的话,也只能写 static
 - 代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块/非静态代码块
 - ; 可以写,也可以不写
 
 
 - 
 - 
当我们不管调用哪个构造器创建对象,都会先调用代码块的内容。代码块调用的顺序优先于构造器
 - 
static 代码块随着类的加载而执行,并且只会执行一次,如果是普通代码块,每创建一个对象,就执行
 - 
类什么时候被加载
- 创建对象实例时(new)
 - 创建子类对象实例,父类也会被加载
 - 使用类的静态成员时(静态属性,静态方法)
 
 - 
普通代码块,在创建对象实例时,会被隐式调用,被创建一次,就会调用一次。
如果只是使用类的静态成员时,普通代码快并不会执行
 - 
创建一个对象,在一个类 调用顺序是:
- 调用静态代码块和静态属性初始化(如果有多个,按它们定义的顺序执行)
 - 调用普通代码块和普通属性的初始化(如果有多个,按它们定义的顺序执行)
 - 调用构造方法
 
 - 
构造器 的最前面其实隐含了 super() 和 调用普通代码块
 - 
创建子类对象时,调用顺序如下:
- 父类的静态代码块和静态属性(优先级一样,按定义的顺序执行)
 - 子类的静态代码块和静态属性(优先级一样,按定义的顺序执行)
 - 父类的普通代码块和普通属性初始化(优先级一样,按定义的顺序执行)
 - 父类的构造方法
 - 子类的普通代码块和普通属性初始化(优先级一样,按定义的顺序执行)
 - 子类的构造方法
 
 - 
静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员
 - 
实例
 
private static int n1 = getN1();//这个就叫静态属性初始化
public static int getN1(){
    return 99;
}
public class Demo03 {
    public static void main(String[] args) {
        System.out.println(Person1.total);
        System.out.println(Person1.total);
    }
}
class Person1{
    public static int total;
    static{
        total = 100;
        System.out.println("执行了!");
    }
}
/*
	执行结果:
        执行了!
        100
        100
*/
//先完成类加载后再执行main方法中的语句

                
            
        
浙公网安备 33010602011771号