发布于2022年10月15日2年前 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方法中的语句
创建帐户或登录后发表意见