美文网首页
类初始化顺序

类初始化顺序

作者: mrjunwang | 来源:发表于2018-07-13 12:47 被阅读0次

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

可以通过以下代码验证

public class InitializationOrder {

    // 静态变量
    public static String staticField = "静态变量";
    // 变量
    public String field = "变量";

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

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

    // 构造器
    public InitialOrderTest() {
        System.out.println("构造器");
    }

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

执行结果为

静态变量
静态初始化块
变量
初始化块
构造器

如果类在继承的情况下则按照 父类(静态变量、静态初始化块)> 子类(静态变量、静态初始化块)> 父类(变量、初始化块)> 父类构造器 > 子类(变量、初始化块)> 子类构造器。
可以通过以下代码验证

class InitializationOrderParent {   
    // 静态变量   
    public static String pStaticField = "父类--静态变量";   
    // 变量   
    public String pField = "父类--变量";   

    // 静态初始化块   
    static {   
        System.out.println(pStaticField);   
        System.out.println("父类--静态初始化块");   
    }   

    // 初始化块   
    {   
        System.out.println(pField);   
        System.out.println("父类--初始化块");   
    }   

    // 构造器   
    public InitializationOrderParent() {   
        System.out.println("父类--构造器");   
    }   
}   

public class InitializationOrderChild extends InitializationOrderParent {   
    // 静态变量   
    public static String sStaticField = "子类--静态变量";   
    // 变量   
    public String sField = "子类--变量";   
    // 静态初始化块   
    static {   
        System.out.println(sStaticField);   
        System.out.println("子类--静态初始化块");   
    }   
    // 初始化块   
    {   
        System.out.println(sField);   
        System.out.println("子类--初始化块");   
    }   

    // 构造器   
    public InitializationOrderChild() {   
        System.out.println("子类--构造器");   
    }   

    // 程序入口   
    public static void main(String[] args) {   
        new InitializationOrderChild();   
    }   
}  

执行结果为

父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

静态变量和静态初始化块之间、变量和初始化块之间的先后顺序取决于它们在类中出现的先后顺序。
http://www.tuicool.com/articles/zeamyeQ

class Super{
public static int m = 11;
static{
System.out.println("执行了super类静态语句块");
}
}

class Father extends Super{
public static int m = 33;
static{
System.out.println("执行了父类静态语句块");
}
}

class Child extends Father{
static{
System.out.println("执行了子类静态语句块");
}
}

public class StaticTest{
public static void main(String[] args){
System.out.println(Child.m);
}
}
执行结果如下:

执行了super类静态语句块
执行了父类静态语句块
33
如果注释掉 Father 类中对 m 定义的那一行,则输出结果如下:

执行了super类静态语句块
11
备注:只有直接定义这个字段的类才会被初始化。在初始化一个类时,要求其父类全部初始化完成
http://wiki.jikexueyuan.com/project/java-vm/class-loading-mechanism.html

相关文章

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

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

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

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

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

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

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

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

  • 类初始化顺序

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

  • 类初始化顺序

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

  • 类初始化顺序

    前言 做Java开发将近一年半了,虽然之前系统地学习过Java,但是实践出真知,最近总感觉还有好多知识点没有掌握,...

  • 类初始化顺序

    前些日至写代码的时候又碰到一个问题,类似于这样: 子类调用父类的构造器,传入自身的非静态成员变量,编译器会报错依稀...

  • 类初始化顺序

    一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性静态方法块: static...

  • 类初始化和加载过程

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

网友评论

      本文标题:类初始化顺序

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