共计 2564 个字符,预计需要花费 7 分钟才能阅读完成。
在下面这个例子中,我们分别在父类和子类中测试了 静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类。
一:代码块及变量测试
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、静态内部类,只有在第一次调用的时候才会被初始化。**
下一章我们会用今天的代码来学习一下类的加载顺序。
如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号 < 情系 IT>,每日推送技术文章供大家学习参考。
正文完
发表至: java
2019-10-29