在下面这个例子中, 我们分别在父类和子类中测试了静态代码块, 普通代码块, 静态成员变量, 普通成员变量, 构造器, 静态内部类.
一: 代码块及变量测试
- 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:[email protected]
- *******************************
父类构造代码块 1
父类全局变量
父类构造代码块 2
父类构造器
子类构造代码块 1
子类全局变量
子类构造代码块 2
子类无参构造器
- Children:[email protected]
- *******************************
三: 测试静态内部类
- 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:[email protected]
- *******************************
- ChildrenHouse:[email protected]
- *******************************
四: 总结
经过我们反复调整顺序进行测试后, 可得出如下结论:
1, 静态代码块, 静态成员变量只有第一次加载类时才会执行.
2, 执行顺序为: 父类静态代码块及父类静态成员变量 (并列优先级)---> 子类静态代码块及子类静态成员变量 (并列优先级)---> 父类普通代码块及父类成员变量 --->父类构造器 --->子类普通代码块及子类成员变量 --->子类构造器.
3, 静态内部类, 只有在第一次调用的时候才会被初始化.
下一章我们会用今天的代码来学习一下类的加载顺序.
如果文章对您有帮助, 请记得点赞关注哟~
欢迎大家关注我的公众号<情系 IT>, 每日技术推送文章供大家学习参考.
来源: http://www.bubuko.com/infodetail-3264159.html