Java—Static静态代码块
静态代码块:在类加载的时候执行静态代码块,只会执行一次
实例初始化代码块:每次调用构造方法之前首先调用实例初始化代码块
例子:
public class Test {
static int cnt = 6;
static {
cnt += 9;
}
public static void main (String[] args) {
System.out.println ("cnt=" + cnt); //cnt = 5
}
static {
cnt/=3;
};
}
解:
静态初始化代码块,静态变量这两个变量是属于同一级别的,是按代码写的顺序执行的!
例子:
public class StaticDemo {
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 initiazer
User3.User3
Student.static initializer
User2.User2
Person.instance initializer
Person.Person
User4.User4
Student.instance initializer
Student.Student
示例二:
class C {
C () {
System.out.println("C");
}
}
class A {
C c = new C ();
A () {
this("A");
System.out.println("A");
}
A(String s) {
System.out.println(s);
}
}
class Test extends A {
Test() {
super("B");
System.out.println("B");
}
public static void main(String[] args) {
new Test(); //CBB
}
}