下面是阿里java校招的一道笔试题,代码如下:
public class HelloA {
//构造方法
public HelloA(){
System.out.println("Hello A!父类构造方法");
}
//非静态代码块(构造块)
{
System.out.println("i'm A class.父类非静态代码块");
}
//静态代码块
static{
System.out.println("static A 父类静态代码块");
}
}
public class HelloB extends HelloA {
//构造方法
public HelloB(){
System.out.println("Hello B! 构造方法");
}
//非静态代码块(构造块)
{
System.out.println("i'm B class.非静态代码块");
}
//静态代码块
static{
System.out.println("static B 静态代码块");
}
public static void main(String[] args) {
System.out.println("---start---");
new HelloB();
new HelloB();
System.out.println("---end---");
}
}
请写出上述代码的输出。
答案如下:
static A 父类静态代码块
static B 静态代码块
---start---
i'm A class.父类非静态代码块
Hello A!父类构造方法
i'm B class.非静态代码块
Hello B! 构造方法
i'm A class.父类非静态代码块
Hello A!父类构造方法
i'm B class.非静态代码块
Hello B! 构造方法
---end---
在上一篇博客《类与对象的继承和多态》中曾总结,java中的语句在执行过程中是有顺序的,顺序如下:
类属性、对象属性、静态块、构造块、构造方法、静态方法、普通方法。
在上述代码中,HelloA是HelloB的父类,两个类中都有静态块、构造块和静态代码块,
且在主类中定义的静态块,优先于main执行。
所以答案前两句输出为:
static A 父类静态代码块
static B 静态代码块
接下来执行main方法中的代码,“ new HelloB(); ” 这一条语句,程序转到HelloB这个子类中执行代码,HelloB的父类是HelloA,所以先执行HelloA中的代码,再回来执行HelloB中的代码,HelloA中有构造块和静态代码块,先执行构造块,再执行静态代码块,HelloB中同理,所以“ new HelloB(); ” 这条语句执行完毕后,输出应如下:
static A 父类静态代码块
static B 静态代码块
---start---
i'm A class.父类非静态代码块
Hello A!父类构造方法
i'm B class.非静态代码块
Hello B! 构造方法
接下来又是 “ new HelloB(); ” 这一条语句,过程如上述,最后执行main方法中的最后一条语句,输出结果就为上述所给的答案。