static静态代码块
public class Person {// 静态代码块:在类加载时候执行静态代码块,只会执行一次static {System.out.println("Person.static initializer");}// 实例初始化块,每次调用构造方法之前首先调用实例初始化块{System.out.println("Person.instance initializer");}public Person() {System.out.println("Person.Person");}
}public void test1() {Person person1 = new Person();Person person2 = new Person();
}
输出顺序为:
Person.static initializer
Person.instance initializer
Person.Person
Person.instance initializer
Person.Person
注意区分静态代码块和实例初始化块的区别,主要体现在执行顺序和执行次数上,静态代码块在类加载的时候执行,因为类只加载一次,所以静态代码块只执行一次,实例初始化块在每次new对象的时候调用构造方法之前被执行,而且每当new一个对象就要执行一次。
静态代码块、实例初始化块、构造方法的执行顺序依次为:静态代码块---->实例初始化块---->构造方法
vpublic class Test{static int cnt = 6;static{cnt += 9;}public static void main(String[] args){System.out.println(“cnt =” + cnt);}static{cnt /=3;};
}
cnt的值是(A)
A、 cnt=5
B、 cnt=2
C、 cnt=3
D、 cnt=6
注意,静态初始化块,静态变量这两个是属于同一级别的,是按代码写得顺序执行的! 而不是先执行静态变量后执行静态初始化块!这是错的。举例:
public class Test { static {cnt = 6;}static int cnt = 100;public static void main(String[] args) {System.out.println("cnt = " + cnt);// 最后输出是50,如果按照错误说法就应该是3// 按顺序执行就是cnt=6--->cnt=100---->cnt = 100/2 = 50.}static {cnt /= 2;}
}
问题:为什么cnt变量的声明放在了后面不报错?JVM加载流程
执行静态变量、静态代码块之前,首先扫描类里面所有的静态变量赋值为默认值cnt=0;
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(4)执行父类构造方法。
(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(6)执行子类构造方法。
public class Person {private static User1 user1 = new User1();private User2 user2 = new User2();// 静态代码块:在类加载时候执行静态代码块,只会执行一次static {System.out.println("Person.static initializer");}// 实例初始化块,每次调用构造方法之前首先调用实例初始化块{System.out.println("Person.instance initializer");}public Person() {System.out.println("Person.Person");}
}public class Student extends Person{private static User3 user3 = new User3();private User4 user4 = new User4();static {System.out.println("Student.static initializer");}{System.out.println("Student.instance initializer");}public Student() {super();System.out.println("Student.Student");}
}
User1.User1
Person.static initializer
User3.User3
Student.static initializer
User2.User2
Person.instance initializer
Person.Person
User4.User4
Student.instance initializer
Student.Student
输出结果为:CBB