JAVA类加载(初始化)顺序
来源:互联网 发布:深圳网络外包公司 编辑:程序博客网 时间:2024/06/16 09:25
虚拟机在加载JAVA类的时候,按照一定的顺序进行加载,了解虚拟机的加载顺序,可以有助于我们更好的去解决问题,下面我们来通过实际的现象来观察虚拟机是如何加载并初始化类的。
为了可以更好的查看初始化过程,我们先来创建一个Log
类,用来输出初始化信息:
package com.jianggujin.loadeorder;public class Log{ public Log(String msg) { System.err.println(msg); }}
在Log
类的对象初始化的时候,直接输出相关信息。
接下来,我们分别创建Parent
和Child
类:
Parent.java
package com.jianggujin.loadeorder;public class Parent{ Log log1 = new Log("父类普通属性"); static Log log2 = new Log("父类静态属性"); static { System.err.println("父类静态代码块"); } public Parent() { System.err.println("父类构造方法"); }}
Child.java
package com.jianggujin.loadeorder;public class Child extends Parent{ Log log1 = new Log("子类普通属性"); static { System.err.println("子类静态代码块"); } static Log log2 = new Log("子类静态属性"); public Child() { System.err.println("子类构造方法"); }}
在这两个类中,我们分别在普通属性、静态属性、静态代码块和构造方法中进行信息输出,最后编写测试类进行测试:
package com.jianggujin.loadeorder;public class MainTest{ public static void main(String[] args) { new Child(); }}
运行程序,观察控制台输出信息
通过控制台信息,我们可以很直观的看到类的加载以及属性的初始化顺序,我们总结一下,在JVM虚拟机加载初始化JAVA类的顺序为:
父类静态属性/父类静态代码块->子类静态代码块/子类静态属性->父类普通属性->父类构造方法->子类普通属性->子类构造方法
了解了类的加载顺序,下面我们再来探讨一下一个对象只声明不赋值,与赋null值在实际使用中,有什么区别,很多人会认为没有被初始化的对象默认就为null,好像没什么区别,下面我们来看一个使用场景,在父类中有一个init()
方法用于初始化的工作,并且该方法在父类的构造方法中进行调用,子类中重写init()
方法,在该方法中对子类成员变量进行初始化,我们来看看效果是否相同:
Parent.java
package com.jianggujin.loadeorder;public class Parent{ public Parent() { init(); } public void init() { }}
Child.java
package com.jianggujin.loadeorder;public class Child extends Parent{ Object obj1; Object obj2 = null; @Override public void init() { System.err.println("子类init方法"); obj1 = new Object(); obj2 = new Object(); }}
编写测试方法进行测试:
package com.jianggujin.loadeorder;public class MainTest{ public static void main(String[] args) { Child child = new Child(); System.err.println(child.obj1); System.err.println(child.obj2); }}
观察控制台,我们会看到类似如下的输出:
java.lang.Object@15db9742
null
由此,我们可以发现只声明不赋值,与赋null值还是有区别的。
0 0
- JAVA类加载(初始化)顺序
- java 类加载-初始化顺序
- java经典面试题(类加载和初始化顺序)
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- Java类的加载及初始化顺序
- java类的加载以及初始化顺序
- java类加载和初始化顺序
- Java类加载问题:变量初始化顺序
- JAVA基础教程:类加载和初始化顺序
- Java类加载及初始化顺序
- java类的加载以及初始化顺序
- java类加载和初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- Java对象加载(初始化)顺序
- CocoadPods 安装中遇到的一些问题
- 8.2 喀迈拉(no.21~no.30)
- jsp 中右键菜单的操作
- Displaying Bitmaps Efficiently之Processing Bitmaps Off the UI Thread
- Python的GIL
- JAVA类加载(初始化)顺序
- Android-通过SlidingPaneLayout高仿微信6.2最新版手势滑动返回(一)
- POJ-----1274二分图vector
- hdu-3664 Permutation Counting ,dp
- Eclipse调试(1)——基础篇
- c++常见面试题30道
- RTP-RTCP协议分析
- 安全退出打开的多个activity
- javascript观察者模式