new对象时,代码的执行顺序
一、静态变量和静态代码
public class Test05 {
public static void main(String[] args) {
Test005 test = new Test005();
}
}
class Test005 {
//1. 静态代码块
static {
System.out.println("静态代码块执行了");
System.out.println("a = "+Test005.a);//0
a = -1;
System.out.println("a = "+Test005.a);//-1
}
//2. 静态变量
static int a = 100;
//3. 构造器
public Test005() {
System.out.println("构造器执行了");
System.out.println("a = "+Test005.a);//100
}
}
/*
静态代码块执行了
a = 0
a = -1
构造器执行了
a = 100
*/
- 从运行结果来看
- 加载类的时候先声明了静态变量a,默认值为0
- 顺序执行到静态代码块初始化a = -1
- 再顺序执行到构造器静态变量赋值a = 100
- 由于静态代码块初始化值后,静态变量又一次重新赋值了
- 因此把静态变量写在静态代码块后是无意义的
- 不管是否在静态代码块中使用静态变量, 都应把静态变量写在静态代码块的上方
二、非静态代码块
在明确了静态变量与静态代码块是按顺序执行后,再来看看加入非静态代码块后的执行顺序
public class Test05 {
public static void main(String[] args) {
Test005 test = new Test005();
}
}
class Test005 {
//3. 非静态代码块
{
System.out.println("非静态代码块执行了");
System.out.println("a = "+Test005.a);//-1
a = 50;
System.out.println("a = "+Test005.a);//50
}
//1. 静态变量
static int a = 100;
//2. 静态代码块
static {
System.out.println("静态代码块执行了");
System.out.println("a = "+Test005.a);//100
a = -1;
System.out.println("a = "+Test005.a);//-1
}
//4. 构造器
public Test005() {
System.out.println("构造器执行了");
System.out.println("a = "+Test005.a);//-1
}
}
/*
静态代码块执行了
a = 100
a = -1
非静态代码块执行了
a = -1
a = 50
构造器执行了
a = 50
*/
- 从运行结果来看
- 非静态代码块运行静态变量和静态代码块之后,在构造器之前
三、如果存在继承关系
public class Test05 {
public static void main(String[] args) {
Test0005 test = new Test0005();
}
}
class Test0005 extends Test005{
//5. 静态变量
static int b;
//5. 静态代码块
static {
System.out.println("子类静态代码块执行了");
System.out.println("a = "+Test0005.b);//0
b = -1;
System.out.println("a = "+Test0005.b);//-1
}
//非静态代码块
{
System.out.println("子类非静态代码块执行了");
System.out.println("a = "+Test0005.b);//-1
b = 100;
}
//6. 子类构造器
public Test0005() {
System.out.println("子类构造器执行了");
System.out.println("b = "+Test0005.b);//100
System.out.println("b = "+b);//100
}
}
class Test005 {
//3. 非静态代码块
{
System.out.println("父类非静态代码块执行了");
System.out.println("a = "+Test005.a);//-1
a = 50;
System.out.println("a = "+Test005.a);//50
}
//1. 静态变量
static int a = 100;
//2. 静态代码块
static {
System.out.println("父类静态代码块执行了");
System.out.println("a = "+Test005.a);//100
a = -1;
System.out.println("a = "+Test005.a);//-1
}
//4. 构造器
public Test005() {
System.out.println("父类构造器执行了");
System.out.println("a = "+Test005.a);//-1
}
}
/*
父类静态代码块执行了
a = 100
a = -1
子类静态代码块执行了
a = 0
a = -1
父类非静态代码块执行了
a = -1
a = 50
父类构造器执行了
a = 50
子类非静态代码块执行了
a = -1
子类构造器执行了
b = 100
b = 100
*/
- 从运行结果来看
- 先执行静态部分(静态变量、静态代码块)
- 父类执行完再执行子类
- 执行完静态部分后,再执行非静态部分(非静态代码块、构造器)
- 父类执行完再执行子类
- 先执行静态部分(静态变量、静态代码块)
四、总结
1. 静态 => 非静态
- 类内容(静态变量、静态初始化块)=> 实例内容(变量、初始化块、构造器)
2. 父类 => 子类
- 父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)

浙公网安备 33010602011771号