zoukankan      html  css  js  c++  java
  • java中在创建对象时候的初始化顺序

        想往技术方向发展还是得注重基础,基础扎实才能飞得更高,今天起Java基础捡起来 共勉。

    看例子

    先看下我写的几个示例类,一个父类,一个子类继承这个父类,最简单的模式。

    Java代码  收藏代码
    1. /**父类*/  
    2. package test;  
    3. public class Father {  
    4.     static  
    5.     { System.out.println("父类静态初始化块");}  
    6.     { System.out.println("父类初始化块");      }  
    7.     private static int b = 1;  
    8.     public Father() {  
    9.         System.out.println("调用了父类无参构造器");  
    10.     }  
    11.     public Father(int b) {  
    12.         this.b = b;  
    13.         System.out.println("调用父类的有参构造器");  
    14.     }  
    15. }  
    Java代码  收藏代码
    1. /**子类*/  
    2. package test;  
    3. public class Son extends Father {  
    4.     static  
    5.     { System.out.println("子类静态初始化块"); }  
    6.     { System.out.println("子类初始化块");       }  
    7.     private static int a =1;  
    8.     public Son() {  
    9.         System.out.println("调用子类的构造器");  
    10.     }  
    11.     public Son(int a){  
    12.         this.a=a;  
    13.         System.out.println("调用子类的有参构造器");  
    14.     }  
    15. }  

     

    •    单独的一个对象初始化,不含继承和其他情况
    Java代码  收藏代码
    1. package test;  
    2. public class Test {  
    3.   
    4.     public static void main(String[] args) {  
    5.         Father father = new Father();  
    6.     }  
    7. }  

     

        打印的结果为:

        父类静态初始化块

        父类初始化块

        调用了父类无参构造器

     

        我们来分析下,大家都知道静态对象(包括静态块,静态方法,静态属性),都是和类相关联的。当第一次创建对象的时候,首先初始化的应该是静态对象,然后才是非静态对象,最后才是构造器去创建实例。所以大致的顺序应该是:静态对象-非静态对象-构造器。那么在静态对象或者非静态对象中是否也存在一个什么顺序呢?经过测试,我们发现其实在同等的优先级的情况下,是按照声明的顺序初始化的。

     

    • 包含继承的子类初始化

    下面讨论另外一个问题,设计到继承的问题,我们现在创建Son对象,他会执行父类的一些初始化么,他和子类的一些初始化之间又存在什么关联呢?

     

    Java代码  收藏代码
    1. package test;  
    2. public class Test {  
    3.     public static void main(String[] args) {  
    4.         Son son = new Son();  
    5.     }  
    6. }  

     

       打印语句:

        父类静态初始化块

       子类静态初始化块

       父类初始化块

       调用了父类无参构造器

       子类初始化块

       调用子类的构造器

      打印语句告诉了我们,静态对象依然是第一个初始化的,然后呢?就是父类中的非静态对象-构造器,子类中的非静态对象-构造器。

     

    • 包含继承和多态的子类初始化

      再看如果是多态的情况下会有什么情况出现呢?

     

    Java代码  收藏代码
    1. package test;  
    2.   
    3. public class Test {  
    4.   
    5.     public static void main(String[] args) {  
    6.         Father father = new Son();  
    7.     }  
    8. }  

     打印语句:

         父类静态初始化块

         子类静态初始化块

         父类初始化块

         调用了父类无参构造器

         子类初始化块

         调用子类的构造器

    和前面继承的情况完全一样,这里不再啰嗦了。

     

    总的一个结论就是:静态对象总是在第一次创建对象前就已经初始化完毕,初始化的顺序从最顶端的父类到子类,只会初始化一次。然后就是从父类到子类中,依次初始化非静态对象和构造器。

     

    原文:http://len-len.iteye.com/blog/1412463

      最近由于工作空闲时间较多(不是酱油哦),闲暇之余,想多学习点java的基础知识。目的嘛,说的大点,就是增加自己的知识的深度。因为目前java的开发人员,很多都处于一个很低层次的水平,完全的code+copy,缺乏对基础知识的掌握,也就完全成为了“码工”,很有必要对基础知识充充电,在以后换工作,面试的时候也许让面试官刮目相看,至少让别人看到了你不只是会code,还有对java的基础理解,面向对象的理解。废话不多说了,进入正题。
        今天想说说java在创建对象的时候的初始化顺序,其实大家如果笔试,或者面试的时候,经常会遇到一些初始化的问题,反正我是遇到过。今天我们就来看看。

        先看下我写的几个示例类,一个父类,一个子类继承这个父类,最简单的模式。

    Java代码  收藏代码
    1. /**父类*/  
    2. package test;  
    3. public class Father {  
    4.     static  
    5.     { System.out.println("父类静态初始化块");}  
    6.     { System.out.println("父类初始化块");      }  
    7.     private static int b = 1;  
    8.     public Father() {  
    9.         System.out.println("调用了父类无参构造器");  
    10.     }  
    11.     public Father(int b) {  
    12.         this.b = b;  
    13.         System.out.println("调用父类的有参构造器");  
    14.     }  
    15. }  
    Java代码  收藏代码
    1. /**子类*/  
    2. package test;  
    3. public class Son extends Father {  
    4.     static  
    5.     { System.out.println("子类静态初始化块"); }  
    6.     { System.out.println("子类初始化块");       }  
    7.     private static int a =1;  
    8.     public Son() {  
    9.         System.out.println("调用子类的构造器");  
    10.     }  
    11.     public Son(int a){  
    12.         this.a=a;  
    13.         System.out.println("调用子类的有参构造器");  
    14.     }  
    15. }  

     

    •    单独的一个对象初始化,不含继承和其他情况
    Java代码  收藏代码
    1. package test;  
    2. public class Test {  
    3.   
    4.     public static void main(String[] args) {  
    5.         Father father = new Father();  
    6.     }  
    7. }  

     

        打印的结果为:

        父类静态初始化块

        父类初始化块

        调用了父类无参构造器

     

        我们来分析下,大家都知道静态对象(包括静态块,静态方法,静态属性),都是和类相关联的。当第一次创建对象的时候,首先初始化的应该是静态对象,然后才是非静态对象,最后才是构造器去创建实例。所以大致的顺序应该是:静态对象-非静态对象-构造器。那么在静态对象或者非静态对象中是否也存在一个什么顺序呢?经过测试,我们发现其实在同等的优先级的情况下,是按照声明的顺序初始化的。

     

    • 包含继承的子类初始化

    下面讨论另外一个问题,设计到继承的问题,我们现在创建Son对象,他会执行父类的一些初始化么,他和子类的一些初始化之间又存在什么关联呢?

     

    Java代码  收藏代码
    1. package test;  
    2. public class Test {  
    3.     public static void main(String[] args) {  
    4.         Son son = new Son();  
    5.     }  
    6. }  

     

       打印语句:

        父类静态初始化块

       子类静态初始化块

       父类初始化块

       调用了父类无参构造器

       子类初始化块

       调用子类的构造器

      打印语句告诉了我们,静态对象依然是第一个初始化的,然后呢?就是父类中的非静态对象-构造器,子类中的非静态对象-构造器。

     

    • 包含继承和多态的子类初始化

      再看如果是多态的情况下会有什么情况出现呢?

     

    Java代码  收藏代码
    1. package test;  
    2.   
    3. public class Test {  
    4.   
    5.     public static void main(String[] args) {  
    6.         Father father = new Son();  
    7.     }  
    8. }  

     打印语句:

         父类静态初始化块

         子类静态初始化块

         父类初始化块

         调用了父类无参构造器

         子类初始化块

         调用子类的构造器

    和前面继承的情况完全一样,这里不再啰嗦了。

     

    总的一个结论就是:静态对象总是在第一次创建对象前就已经初始化完毕,初始化的顺序从最顶端的父类到子类,只会初始化一次。然后就是从父类到子类中,依次初始化非静态对象和构造器。

  • 相关阅读:
    Linux(Centos7)yum安装最新redis
    refresh table tablename ;MSCK REPAIR TABLE table_name;
    整个shuffle的流程图
    Vim简明教程
    centos vim 7.3 升级 + vim 简单配置文件
    Python——可变类型与不可变类型(即为什么函数默认参数要用元组而非列表)
    python——修饰符
    转——《将人性置之死地而后生》刘夙
    各学科领域入门书籍推荐
    python——关于Python Profilers性能分析器
  • 原文地址:https://www.cnblogs.com/huideng/p/5282458.html
Copyright © 2011-2022 走看看