当声明父类而用子类实例化时:
public
class
Main {
public
static
int
i
=
methodi
();
public
int
y
=methody();
public
static
int
methodi() {
System.
out
.println(
"i"
);
return
1;
}
public
int
methody() {
System.
out
.println(
"y"
);
return
1;
}
public
Main() {
System.
out
.println(
"Main构造器"
);
}
{
System.
out
.println(
"Main普通代码块"
);
}
static
{
System.
out
.println(
"Main静态代码块"
);
}
public
static
void
main(String[]
args
) {
Main
m
=
new
x();
}
}
class
x
extends
Main{
public
x() {
System.
out
.println(
"x构造器"
);
}
{
System.
out
.println(
"x普通代码块"
);
}
static
{
System.
out
.println(
"x静态代码块"
);
}
}
输出为:
i
Main静态代码块
x静态代码块
y
Main普通代码块
Main构造器
x普通代码块
x构造器
当 Main m=new Main(); 时。
输出为:
i
Main静态代码块
y
Main普通代码块
Main构造器
当 x x=new x(); 时。
输出为:
i
Main静态代码块
xi
x静态代码块
y
Main普通代码块
Main构造器
x普通代码块
x构造器
总结:单个类执行顺序:先执行静态的全局变量和代码块(按代码顺序执行),再执行普通的全局变量和代码块(也是按代码顺序执行),类构造器。
当声明父类而用子类实例化时执行顺序:
父类静态代码,子类静态代码,父类普通代码,父类构造器,子类普通代码,子类构造器。