请写出下列程序的运行结果。
java静态代码块
public class Father {
static{
System.out.println("Father___静态代码块");
}
public Father() {
System.out.println("Father___构造方法");
}
}
class Son extends Father {
static{
System.out.println("Son___静态代码块");
}
public Son() {
System.out.println("Son___构造方法");
}
}
class Test {
public static void main(String [] args){
Father son=new Son();
son=new Son();
}
}
运行结果:
Father___静态代码块
Son___静态代码块
Father___构造方法
Son___构造方法
加载顺序:静态代码块 > 构造器。
原因:因为是继承关系,所以首先会加载Father的静态代码块,然后加载Son的静态代码块,之后在加载Father的构造方法,然后在加载Son的构造方法,且静态代码块在这个类被调用时只执行一次。
java非静态代码块
public class Father {
{
System.out.println("Father___非静态代码块");
}
public Father() {
System.out.println("Father___构造方法");
}
}
class Son extends Father {
{
System.out.println("Son___非静态代码块");
}
public Son() {
System.out.println("Son___构造方法");
}
}
class Test {
public static void main(String [] args){
Father son=new Son();
son=new Son();
}
}
输出结果:
Father___非静态代码块
Father___构造方法
Son___非静态代码块
Son___构造方法
加载顺序:非静态代码块 > 构造方法
原因:因为是继承关系,所以首先会加载Father的非静态代码块,然后加载Son的非静态代码块,之后在加载Father的构造方法,然后在加载Son的构造方法,且非静态代码块每实例化一次就会执行一次。