• 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,或者扫描下面二维码。


    每日一帖,技术鸡汤。

  • 相关阅读:
    Python queue 模块详解
    贪婪算法的解题思路
    python中os.path.abspath和os.path.realpath区别
    python报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 4: ordinal not in range
    Python Socket Error: Address already in use的解决办法
    Python里的string 和 unicode 区别讲得很明白的文章
    linux环境,crontab报错Authentication token is no longer valid; new one required You (aimonitor) are not allowed to access to (crontab) because of pam configuration.
    Mac系统使用Parallels Desktop安装Win10
    windows update国内服务器
    黄海机器的向日葵远程帐号
  • 原文地址:https://www.cnblogs.com/jiangkuan/p/6025892.html
Copyright © 2020-2023  润新知