前两天做Java笔试题碰到了这么一个问题,代码没有记下来,靠着大概印象以及参考网上类似的题写出来,大致如下:
package com.forTest.testCLassInitialization;
/**
* Name: Test
* Author: xian
* Email:
* Comment: //TODO
* Date: 2018-03-31 16:28
*/
class A{
static {
System.out.println("static init area A");
}
{
System.out.println("instance init area A");
}
A() {
System.out.println("A constructor");
}
}
class B extends A{
static {
System.out.println("static init area B");
}
{
System.out.println("instance init area B");
}
B() {
System.out.println("B constructor");
}
}
class C extends B{
static {
System.out.println("static init area C");
}
{
System.out.println("instance init area C");
}
C() {
System.out.println("C constructor");
}
}
public class Test {
static {
System.out.println("static init area main");
}
{
System.out.println("instance init area main");
}
Test() {
System.out.println("main constructor");
}
public static void main(String[] args) {
C c = new C();
System.out.println("------------------");
B b = new B();
}
}
然后问题就是问你输出结果,我一开始能想到的就是考查类加载器的,但是凭着印象想了很久,也没想出答案(还是得再回去看书),只猜了个大概,后来考完再去网上找找类似的题,得到的打印顺序如下:
1. 父类的静态初始化块
2. 子类的静态初始化块
3. 父类的初始化块
4. 父类的构造函数
5. 子类的初始化块
6. 子类的构造函数
于是打了上面的代码试试,(在IDEA的环境下)得到的结果如下:
看来还是学的不够深入,还得多看看书,找题目练习下。
更详细的内容可以参考以下文章:
Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究