zoukankan      html  css  js  c++  java
  • java类对象的初始化顺序

    在下面这个例子中,我们分别在父类和子类中测试了静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类

    一:代码块及变量测试

    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>,每日技术推送文章供大家学习参考。

  • 相关阅读:
    Codeforces Round #563 (Div. 2)B;Ehab Is an Odd Person
    Codeforces Round #563 (Div. 2)C. Ehab and a Special Coloring Problem
    Codeforces Round #567 (Div. 2) A.Chunga-Changa
    Codeforces Round #569 (Div. 2) B. Nick and Array
    Codeforces Round #570 (Div. 3) B. Equalize Prices
    2019年银联极客挑战赛第一题
    js点击保存图片
    vant地区三级联动
    input 输入金额正则判断
    git 实用命令
  • 原文地址:https://www.cnblogs.com/zhixie/p/11761642.html
Copyright © 2011-2022 走看看