类的加载和初始化

今天面试了几个新进员工。老大要求多考察java基础,所以就搬出了一些比较经典的面试题。其中有一道题,是关于类的加载和初始化的。代码如下:

class Grandpa
{
    static
    {
        System.out.println("爷爷静态代码");
    }

    public Grandpa() {
        System.out.println("我是爷爷~");
    }
}
class Father extends Grandpa
{
    static
    {
        System.out.println("爸爸静态代码");
    }

    {
        System.out.println("爸爸在干啥");
    }

    public Father()
    {
        System.out.println("我是爸爸~");
    }
}
class Son extends Father
{
    static
    {
        System.out.println("儿子在静态代码块");
    }

    {
        System.out.println("儿子在干啥");
    }

    public Son()
    {
        System.out.println("我是儿子~");
    }
}
 class InitializationDemo
{
    public static void main(String[] args)
    {
        new Son();  //测试入口
    }
}

请你写出输出的字符串答案?
一般来说,如果java的加载机制不熟悉的话,是无法把这道题答正确的,因为即便是蒙,也通过不了(答出来后还要说出原因)。所以对这种题目来说,一定要耐着性子去学习java的底层,并且多总结。一言蔽之,java的加载初始化顺序遵循的规则一般是:父类静态代码块-子类静态代码块-父类代码块-子类代码块-父类构造方法-子类构造方法的顺序。

所以,本题的答案应该是:

爷爷在静态代码块
爸爸在静态代码块
儿子在静态代码块
我是爷爷~
爸爸在干啥
我是爸爸~
儿子在干啥
我是儿子~

猜你喜欢

转载自blog.csdn.net/xzq19920203/article/details/88926063