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