2017-05-24供稿中心: 北大青鸟武汉中南软件学院
我们经常通过new关键字来初始化一个类,但是大家有了解在new的时候发生什么事情吗,今天我们来谈谈Java中类初始化的一些问题。
首先看一个例子:
父类里面有一个静态代码块,还有一个静态变量,子类继承父类,并也有自己的静态代码块。
然后在客户端的代码如下:
大家知道这个会打印出什么吗?真正的结果如下:
这其实是虚拟机的一个优化,当我们输出的时候,由于我们这个时候是输出父类里面的一个静态变量,所以这个时候是没必要初始化子类的,所以子类里面的静态代码块是不会有输出的。我们做另外一个实验,在子类写一个静态变量覆盖父类的静态变量。
这个时候重新运行客户端程序,发现结果输出如下:
这个时候不仅父类的初始化了,子类的也跟着初始化了,并且由于子类覆盖了父类的静态变量,所以输出的静态变量也变成子类的静态变量了。
总结:当没必要初始化子类的时候,虚拟机是不会初始化子类的。