• java类的初始化顺序


     在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图:

        

    一、单类(无基类)下的初始化顺序:

    public class Parent {

    static String staticStr = "父类静态变量";

    private String str = "父类成员变量";

    static {

    System.out.println(staticStr);

      System.out.println("父类静态初始化块");

    }

    {

    System.out.println(str);

      System.out.println("父类初始化块");

    }

    public Parent() {

      System.out.println("父类构造");

    }

    public static void main(String[] args) {

      new Parent();

         //new Parent();

    }

    }

    输出:父类静态变量

               父类静态初始化块

               父类成员变量

               父类初始化块

               父类构造

                /* 若放开第二行new Parent(),输出结果会增加以下内容:

                父类成员变量

               父类初始化块

               父类构造

                */

    单类顺序:  ①静态(成员,块) > 非静态(成员,块) > 构造

                      ②成员和块的顺序取决于“他们在类中定义时的前后位置,谁靠前谁先被初始化”。

                      ③静态成员或块是属于类的,所以优先初始化,且只会初始化一次。

                      ④构造最后被执行。

    二、继承类的初始化顺序

    class SubClass extends Parent {

    static String staticStr = "子类静态变量";

    private String str = "子类成员变量";

    static {

    System.out.println(staticStr);

      System.out.println("子类静态初始化块");

    }

    {

    System.out.println(str);

      System.out.println("子类初始化块");

    }

    public SubClass() {

      System.out.println("子类构造");

    }

    public static void main(String[] args) {

    System.out.println("子类main方法");

      new SubClass();

    }

    }

    输出:父类静态变量

              父类静态初始化块

              子类静态变量

              子类静态初始化块

              子类main方法

              父类成员变量

              父类初始化块

              父类构造

              子类成员变量

              子类初始化块

              子类构造

    继承类顺序:

                    ①父类静态(成员,块) > 子类静态(成员,块) > 父类非静态(成员,块) > 父类构造 > 子类非静态(成员,块)> 子类构造

                    ②同样的,成员和块的顺序和单类中一样

                    ③先有父才有子,但是子类的静态(成员和块)先于父类的非静态(成员和块),因为静态是属于类的;对于非静态和构造,自然是父类中全部加载完毕,再加载子类。

    关注老姜谈技术,微信号:helojava,或者扫描下面二维码。


    每日一帖,技术鸡汤。

  • 相关阅读:
    微软老将Philip Su的离职信:回首12年职场生涯的心得和随笔[转]
    <Programming Ruby 1.9 The Pragmatic Programmer>读书笔记
    Ruby:Update value on specific row but keep the headers
    解决ImportError: cannot import name webdriver
    Ruby几个相关目录
    《发财日记》处处都是名言警句
    软件研发管理最佳实践(20121020 深圳)
    中国过程改进年会会前培训:让敏捷落地! 软件研发管理最佳实践(2012530 北京)
    展示你的才华,成就你的事业!—— 疯狂讲师
    网络直播课程 体验极限编程(XP)
  • 原文地址:https://www.cnblogs.com/jiangkuan/p/6025892.html
Copyright © 2020-2023  润新知