首先申明菜鸟一个,求助各位大神
今天去面试,有一到面试题,回来一测试,让人大跌眼镜,实在不懂
写出下面程序的结果: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
今天去面试,有一到面试题,回来一测试,让人大跌眼镜,实在不懂
写出下面程序的结果: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
解决方案 »
- 测试DataOutputStream和FileWrite的性能
- 请用最简洁的话回答这个问题:TCP和SOCKET什么关系
- jtable添加数据,
- 求助:有什么办法可以不用重载paintComponent()方法来画直线?
- 请教比较灵活的从xml文件生成bean的方法??
- Exception in thread "main" java.lang.NullPointerException问题,请大家帮忙
- 能用jsp实现锁屏功能吗?
- 把數字format成錢幣
- 如何判断某一未知字符串是否包含已知字符串?
- myeclipse如何设置使得程序运行后console自动弹出
- 为什么我这个程序中的变量x与y不能显示?
- 求助 关于窗体的问题
这么说吧:
类初始化的过程是这样的:
1.利用构造方法实例化一个对象的时候,每一个类的构造方法第一句都会有一个隐式的super()语句,所以在实例化一个对象的时候,会先去实例化父类,会对父类所有的非静态成员变量进行初始化,初始化完毕之后然后初始化自己的类的非静态成员变量。
2.针对静态的变量,会在类被加载到内存的时候被调用,楼主可以讲静态代码块类似看成一个静态成员变量,这个静态代码块会在类加载的时候就执行。
3.对于静态成员变量,继承结构中所有的子类和父类都是共享的,利用子类去调用静态变量时实际上等效于父类去调用。
以上三点在结合楼主的实际问题,我想楼主纳闷的是为什么Zi类中的静态代码块没有执行,其实在调用Zi.value的时候,根据第三条是等效Fu.value,这里的Zi其实是没有被加载的,只是Fu类被加载了,所以会先输出++++++++++++,然后main方法输出5,而Zi实际上是没有被加载的,所以没有被执行。