一个java初始化的例子
运行结果
结论:执行main方法,必须加载test2类,然后静态域b和c被初始化,然后他们对应的类被加载,由于他们对应的类也包含静态A对象,所以A也被加载,所以在这个程序中,所有的类在main()开始之前就都被加载了。初始化的顺序是先静态对象,而后是非静态对象。静态初始化只有在类被初始化时才会创建,只有在第一次对象被初始化,或者第一次访问静态数据的时候,他们才被初始化,此后,静态对象不会再次被初始化。
疑问?
在看thinking in java 第四版189页中提到“即使没有显示地使用static关键字,构造器实际上也是静态方法”这句话产生了疑问,如果构造器是静态的话,那么里面的字段和方法也必须是静态的了,但是实际使用过程中并不是这样。对于这个疑问,网上查阅资料,这可能是作者的一个小错误。贴上具体博客地址 https://blog.csdn.net/bluetjs/article/details/52598635 。附上一段代码验证:
摘抄一段解释:
-------------------------------------------------------------------------------------------------------------
java语言规范里有这么一句话
Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.
实例构造器无法被隐藏或覆写,不参与多态,因而可以做静态绑定。从这个意义上可以认为实例构造器是“静态”的,但这种用法与Java语言定义的“静态方法”是两码事
--------------------------------------------------------------------------------------------------------------
疑问结束
java的初始化顺序,贴上一段代码
父类:
子类:
主方法:
运行结果:
在没有把初始化的顺序了解透彻的话很容易会理所当然的理解为先执行父类的静态代码块再执行父类的代码块,然后再执行子类的静态代码块再执行子类的代码块,在第一次看到这个程序的时候我也犯了同样的错误,并且在执行父类初始化的时候调用的show方法理所当然的认为是调用了父类的show方法,其实初始化的是子类的对象,调用的是被子类重写的show方法。
得出结论,初始化的顺序:
父类静态变量、 父类静态初始块 (它们的在类中的顺序就决定了它们的初始化顺序,而不是变量一定会优先于初始块)> 子类静态变量 、子类静态初始块 > 父类成员变量 、父类非静态初始块(顺序执行,debug下看到不在代码块中输入成员变量,没有执行到成员变量初始化时,成员变量为null) > 父类构造器 > 子类成员变量 、 子类非静态初始块 (顺序执行)> 子类构造器
清理:
JAVA垃圾回收器负责回收无用对象占据的内存资源。垃圾回收器只释放那些由new分配的内存。
1.对象可能不被垃圾回收
2.垃圾回收至于内存相关