日期:2014-05-20  浏览次数:20783 次

关于父类、子类静态代码块的问题
首先申明菜鸟一个,求助各位大神
今天去面试,有一到面试题,回来一测试,让人大跌眼镜,实在不懂
写出下面程序的结果:

public class App 
{
public static void main(String[] args) 
{
System.out.println(Zi.value);
}
}
class Fu 
{
static
{
System.out.println("++++++++++++");
}
public static int value=5;
}
class Zi extends Fu
{
static
{
System.out.println("------------");
}
}

回来测试的记过竟然是:
+++++++++
5
不明白为什么,麻烦知道原理的大神给解释哈,谢谢
java

------解决方案--------------------
楼主是初学Java吧,这个问题比较绕的问题,我当时也思考过这个问题,楼主还是一个爱思考的学习者呢,
这么说吧:
类初始化的过程是这样的:
1.利用构造方法实例化一个对象的时候,每一个类的构造方法第一句都会有一个隐式的super()语句,所以在实例化一个对象的时候,会先去实例化父类,会对父类所有的非静态成员变量进行初始化,初始化完毕之后然后初始化自己的类的非静态成员变量。
2.针对静态的变量,会在类被加载到内存的时候被调用,楼主可以讲静态代码块类似看成一个静态成员变量,这个静态代码块会在类加载的时候就执行。
3.对于静态成员变量,继承结构中所有的子类和父类都是共享的,利用子类去调用静态变量时实际上等效于父类去调用。
以上三点在结合楼主的实际问题,我想楼主纳闷的是为什么Zi类中的静态代码块没有执行,其实在调用Zi.value的时候,根据第三条是等效Fu.value,这里的Zi其实是没有被加载的,只是Fu类被加载了,所以会先输出++++++++++++,然后main方法输出5,而Zi实际上是没有被加载的,所以没有被执行。