java初始化小发现

今天复习java基础知识,发现个小问题。代码请看附件。

打印出的内容如下:
static Insect.prt initialized,a = 0
static Insect.x1
static Insect.prt initialized,a = 0
static Beetle.x2 initialized
Beetle constructor
i = 9,j = 0
Beetle.k initialized
k = 47
j = 39

发现static函数prt被初始化两次,在父类和子类中分别被初始化两次。
后来想想了,可能可以从自己的判断条件上改一下,就能解决“static Insect.prt initialized,a = 0”被打印两次的问题。“a == 0”改为“a == 1”当然初始化的值要改一下。于是prt方法就不会被打印2次了。不过本质上static方法还是被初始化多次,初始化过程需要递归调用未被初始化却被使用的方法。但是类变量和方法都会被递归调用多次初始化,如果父类子类中都有的话。

结论:类变量由于在编译早期完成初始化,会存在递归并且多次初始化的过程。但是在实例生成之前,类变量和类函数的初始化已经完成,所以对实例来说,类变量和类函数是被认为是一次初始化的。也就有了,所有类无论多少实例都只有“一份”类变量和类函数的理解。

这是我的理解,有问题欢迎提出,感谢讨论谢谢。

你可能感兴趣的:(java初始化小发现)