public 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变量的声明放在了后面不报错?
static {
cnt = 6;
}
static int cnt = 100;
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(4)执行父类构造方法。
(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(6)执行子类构造方法。
User.User
Person.static initializer
Student.static initializer
Person.instance initializer
Person.Person
Student.instance initializer
Student.Student
答案:CBB
解析:先执行父类实例变量得到C
在执行父类构造方法得到B
在执行子类构造方法得到B
父类中的无参构造方法没有被调用,不用管