面试 请问下面代码的输出是怎样的?
// Dad.java
public class Dad {
static {
System.out.println("父类--静态代码块---------- 1");
}
private static Dad dad = new Dad();
static {
System.out.println("父类--静态代码块---------- 2");
}
public Dad() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
System.out.println("main---------------- 1");
new Son();
System.out.println("main---------------- 2");
new Son();
}
}
class Son extends Dad {
static {
System.out.println("子类--静态代码块------------ 1");
}
private static Son son = new Son();
static {
System.out.println("子类--静态代码块------------ 2");
}
{
System.out.println("子类--非静态代码块");
}
public Son() {
//super(); //默认调用
System.out.println("子类--构造函数");
}
}
思考一下
3
2
1
父类--静态代码块---------- 1
父类--非静态代码块
父类--构造函数
父类--静态代码块---------- 2
main---------------- 1
子类--静态代码块------------ 1
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块------------ 2
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
main---------------- 2
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
属性、方法、构造方法和自由块都是类中的成员,在创建对象时,各成员的执行顺序如下。
1) 父类 静态成员 和 静态初始化块, 按在代码中 出现的顺序 依次执行。
2) 子类 静态成员 和 静态初始化块, 按在代码中 出现的顺序 依次执行。
3) 父类 实例成员 和 实例初始化块, 按在代码中 出现的顺序 依次执行。
4) 执行父类 构造方法。
5) 子类 实例成员 和 实例初始化块, 按在代码中 出现的顺序 依次执行。
6) 执行子类 构造方法。
continue...
网友评论