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=5
对于一个类而言,按照如下顺序执行:
- 执行静态代码块
- 执行构造代码块
- 执行构造函数
没有继承情况下
1. 执行顺序
1. 静态成员变量
2. 静态代码块
3. 普通成员变量
4. 普通代码块
5. 构造函数
2. 总结:
1. 静态->普通
2. 变量->代码块->构造函数
3. 构造函数是最后执行的
3. 代码简易实现:
public class Father {
private static String name = "zct";
private int age = 50;
{
System.out.println("father age: "+age);
System.out.println("father 我是普通代码块");
}
static{
System.out.println("father static name: "+name);
System.out.println("father 我是静态代码块");
}
public Father(){
System.out.println("father 我是构造函数");
}
}
4. 测试:
@org.junit.Test
public void test(){
Father father = new Father();
}
5. 测试结果:
father static name: zct
father 我是静态代码块
father age: 50
father 我是普通代码块
father 我是构造函数
子类继承父类的情况下
1. 执行顺序
1. 父类的静态成员变量
2. 父类的静态代码块
3. 子类的静态成员变量
4. 子类的静态代码块
5. 父类的成员变量
6. 父类的代码块
7. 父类的构造函数
8. 子类的成员变量
9. 子类的代码块
10. 子类的构造函数
2. 总结:
1. 先父类再子类
2. 如果子类有静态成员变量和静态代码块,则执行完父类的静态成员变量和静态代码块后,接着执行子类的静态变量和静态代码块,
否则直接按照父类的变量->代码块->构造函数,再执行子类的变量->代码块->构造函数
3. 需要注意的是子类的静态变量和静态代码块是优先于父类的普通成员变量和代码块以及构造函数的。
4. 这也说明了先静态->再普通
3. 代码简易实现:
public class Son extends Father{
private static String name = "zlc";
private int age = 26;
{
System.out.println("son age: "+age);
System.out.println("son 我是普通代码块");
}
static{
System.out.println("son static name: "+name);
System.out.println("son 我是静态代码块");
}
public Son(){
System.out.println("son 我是构造函数");
}
}
4. 测试:
@org.junit.Test
public void test(){
Son son = new Son();
}
5. 测试结果:
father static name: zct
father 我是静态代码块
son static name: zlc
son 我是静态代码块
father age: 50
father 我是普通代码块
father 我是构造函数
son age: 26
son 我是普通代码块
son 我是构造函数