美文网首页
类的初始化顺序

类的初始化顺序

作者: 乌子啦 | 来源:发表于2018-12-20 15:24 被阅读0次

Java类中包含如下几类部分:
1.静态变量——用static修饰的变量
2.静态初始化块——static{}圈起来的初始化块
3.静态方法——用static修饰的方法
4.变量
5.初始化块
6.构造器
7.普通方法

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序是(静态变量、静态初始化块)>(变量、初始化块)>构造器

public class Test1 {
    public static String var1 = getStaticField();
    public String var2 = getField();

    static {
        System.out.println("Test1 静态初始化块 初始化");
    }

    {
        System.out.println("Test1 初始化块 初始化");
    }

    public Test1() {
        System.out.println("Test1 构造函数 初始化");
    }

    public static String getStaticField() {
        String statiFiled = "Static Field Initial";
        System.out.println("Test1 静态变量 初始化");
        return statiFiled;
    }

    public static String getField() {
        String filed = "Field Initial";
        System.out.println("Test1 普通变量 初始化");
        return filed;
    }

    public static void main(String[] args) {
        Test1 test1 = new Test1();
    }
}

运行该程序,可以看到执行结果如下:

Test1 静态变量 初始化
Test1 静态初始化块 初始化
Test1 普通变量 初始化
Test1 初始化块 初始化
Test1 构造函数 初始化

那静态变量和静态初始化块孰先孰后呢?这跟代码的书写顺序有关,静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。

那么在继承关系下的情况又是如何呢?我们也用一段代码来测试一下。编写一个Test2类继承Test1:

public class Test2 extends Test1 {
    public static String var1 = getStaticField();
    public String var2 = getField();

    static {
        System.out.println("Test2 静态初始化块 初始化");
    }

    {
        System.out.println("Test2 初始化块 初始化");
    }

    public Test2() {
        System.out.println("Test2 构造函数 初始化");
    }

    public static String getStaticField() {
        String statiFiled = "Static Field Initial";
        System.out.println("Test2 静态变量 初始化");
        return statiFiled;
    }

    public static String getField() {
        String filed = "Field Initial";
        System.out.println("Test2 普通变量 初始化");
        return filed;
    }

    public static void main(String[] args) {
        Test2 Test2 = new Test2();
    }
}

执行Test2中的main方法,可以看到控制台输出结果如下:

Test1 静态初始化块 初始化
Test1 静态变量 初始化
Test2 静态变量 初始化
Test2 静态初始化块 初始化
Test1 普通变量 初始化
Test1 初始化块 初始化
Test1 构造函数 初始化
Test2 普通变量 初始化
Test2 初始化块 初始化
Test2 构造函数 初始化

由此可以得出结论:
父类(静态变量、静态初始化块)>子类(静态变量、静态初始化块)>父类(变量、初始化块)>父类构造器>子类(变量、初始化块)>子类构造器

相关文章

  • C++对象模型5——对象的构造/析构

    对象的构造/析构顺序 初始化虚基类,按照继承顺序,从左到右,从最深到最浅。 初始化按照继承顺序初始化父类,如果父类...

  • 9道题来理解什么是类的主动引用和被动引用

    剖析类的初始化顺序? 题目: 执行结果: 剖析类的初始化顺序? 先执行父类的方法,再执行子类的

  • 构造器内部的多态方法的行为

    上一篇 :Java类初始化顺序 上一节我们简单总结了类的初始化顺序。父类(静态变量、静态初始化块)>子类(静态变量...

  • [转]Effective C++学习笔记:初始化列表中成员列出的

    类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行;...

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

  • Java学习笔记 - 类方法与代码块的执行顺序

    类的初始化顺序 静态初始化块位于类的第一次初始化最前端执行,先父类后子类,是类的初始化块。 初始化块位于每次对象被...

  • java中的继承

    继承的关键之是extends子类 extends 父类 继承的初始化顺序 初始化父类再初始化子类 先执行初始化对象...

  • Kotlin记录

    1. kotlin类的调用顺序调用顺序 答:变量初始化 --> init{} --> constractor{} ...

  • 类初始化顺序

    对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始...

  • 类初始化顺序

    当类第一次加载到内存中的时候初始化 父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 子类静态成员和静态...

网友评论

      本文标题:类的初始化顺序

      本文链接:https://www.haomeiwen.com/subject/cjuykqtx.html