JAVA类加载(初始化)顺序
虚拟机在加载JAVA类的时候,按照一定的顺序进行加载,了解虚拟机的加载顺序,可以有助于我们更好的去解决问题,下面我们来通过实际的现象来观察虚拟机是如何加载并初始化类的。
虚拟机在加载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)