在下面这个例子中,我们分别在父类和子类中测试了静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类。
一:代码块及变量测试
class Field{
public static String baseFieldInit(){
System.out.println("父类全局变量");
return "";
}
public static String baseStaticFieldInit(){
System.out.println("父类静态变量");
return "";
}
public static String fieldInit(){
System.out.println("子类全局变量");
return "";
}
public static String staticFieldInit(){
System.out.println("子类静态变量");
return "";
}
}
class Father{
static {
System.out.println("父类静态代码块1");
}
private static String staticValue = Field.baseStaticFieldInit();
static {
System.out.println("父类静态代码块2");
}
{
System.out.println("父类构造代码块1");
}
private String value = Field.baseFieldInit();
{
System.out.println("父类构造代码块2");
}
Father(){
System.out.println("父类构造器");
}
}
public class Children extends Father {
static {
System.out.println("子类静态代码块1");
}
private static String staticValue = Field.staticFieldInit();
static {
System.out.println("子类静态代码块2");
}
{
System.out.println("子类构造代码块1");
}
private String value = Field.fieldInit();
{
System.out.println("子类构造代码块2");
}
public Children(){
System.out.println("子类无参构造器");
}
private static class House{
private static Children houseColor = new Children();
}
/**
* 测试类
*/
public static void main(String[] args) {
Children children = new Children();
System.out.println("Children:"+children);
System.out.println("*******************************");
// 第二遍
Children children1 = new Children();
System.out.println("Children:"+children1);
System.out.println("*******************************");
}
}
二:测试结果
父类静态代码块1
父类静态变量
父类静态代码块2
子类静态代码块1
子类静态变量
子类静态代码块2
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
Children:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
Children:com.zhixie.jvmclassload.demo.Children@1be6f5c3
*******************************
三:测试静态内部类
public static void main(String[] args) {
Children chouse = House.houseColor;
System.out.println("ChildrenHouse:"+chouse);
System.out.println("*******************************");
Children chouse1 = House.houseColor;
System.out.println("ChildrenHouse:"+chouse1);
System.out.println("*******************************");
}
父类静态代码块1
父类静态变量
父类静态代码块2
子类静态代码块1
子类静态变量
子类静态代码块2
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
四:总结
经过我们反复调整顺序进行测试后,可得出如下结论:
1、静态代码块、静态成员变量只有第一次加载类时才会执行。
2、执行顺序为:父类静态代码块及父类静态成员变量(并列优先级)—>子类静态代码块及子类静态成员变量(并列优先级)—>父类普通代码块及父类成员变量—>父类构造器—>子类普通代码块及子类成员变量—>子类构造器。
3、静态内部类,只有在第一次调用的时候才会被初始化。
下一章我们会用今天的代码来学习一下类的加载顺序。
如果文章对您有帮助,请记得点赞关注哟~
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦