首先申明菜鸟一个,求助各位大神
今天去面试,有一到面试题,回来一测试,让人大跌眼镜,实在不懂
写出下面程序的结果: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

解决方案 »

  1.   

    Zi.value 此时 Fu先走一遍,Static执行一下,完了打印Zi.value的值5
      

  2.   

    Zi.value 为什么加载的是父类,子类没有被加载?这个里面是什么原理?
      

  3.   

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

  4.   

    楼主现在不明白没有关系,慢慢你会理解JVM的一些机制的,祝楼主天天进步,加油