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

  • 相关阅读:
    JavaScript词法结构
    【python】类变量、实例变量
    把pandas dataframe转为list方法
    list 删除一个元素的三种做法--python
    Web.config中rewite 节点引起的500.19错误
    extjs让按钮可用或者不可用
    VS2010启动奔溃
    迟来的年终总结
    Nginx配置多个server
    RestSharp的简单用法
  • 原文地址:https://www.cnblogs.com/zhixie/p/11761642.html
Copyright © 2011-2022 走看看