Java类初始化顺序,大神3个示例带你躺坑。。

简介: 最近发现微信群里面有些群友在讨论类的初始化顺序,如类的静态变量、成员变量、静态代码块、非静态代码块、构造器,及继承父类时,它们的初始化顺序都是怎样的,下面我通过例子来说明这个情况,以免被人误导。

最近发现微信群里面有些群友在讨论类的初始化顺序,如类的静态变量、成员变量、静态代码块、非静态代码块、构造器,及继承父类时,它们的初始化顺序都是怎样的,下面我通过例子来说明这个情况,以免被人误导。

示例1:测试单类的初始化顺序

public class ClassInitOrderTest {
    public static String staticField = "static field";
    static {
        System.out.println(staticField);
        System.out.println("static block");
    }
    private String field = "member field";
    {
        System.out.println(field);
        System.out.println("non-static block");
    }
    public ClassInitOrderTest() {
        System.out.println("constructor");
    }
    public static void main(String[] args) {
        new ClassInitOrderTest();
    }
}

程序输出:

static field
static block
member field
non-static block
constructor

可以得出以下结论,单类的初始化顺序为:

静态变量 > 静态初始块 > 成员变量 > 非静态初始块 > 构造器

示例2:测试类继承的初始化顺序

class Parent {
    private static String parentStaticField = "parent static field";
    static {
        System.out.println(parentStaticField);
        System.out.println("parent static block");
    }
    private String parentField = "parent member field";
    {
        System.out.println(parentField);
        System.out.println("parent non-static block");
    }
    public Parent() {
        System.out.println("parent constructor");
    }
}
public class Child extends Parent {
    private static String childStaticField = "child static field";
    static {
        System.out.println(childStaticField);
        System.out.println("child static block");
    }
    private String childField = "child member field";
    {
        System.out.println(childField);
        System.out.println("child non-static block");
    }
    public Child() {
        System.out.println("child constructor");
    }
    public static void main(String[] args) {
        new Child();
    }
}

程序输出:

parent static field
parent static block
child static field
child static block
parent member field
parent non-static block
parent constructor
child member field
child non-static block
child constructor

可以得出以下结论,单类的初始化顺序为:


父类静态变量 > 父类静态初始块 > 子类静态变量 > 子类静态初始块 > 父类成员变量 > 父类非静态初始块 > 父类构造器 > 子类成员变量 > 子类非静态初始块 > 子类构造器


示例3:测试成员变量、初始块的初始化顺序

从上面两个例子可以看出,父类的静态变量和静态初始块肯定是先于子类加载的。但同一个类中的静态变量与静态初始块之间,成员变量与初始块之间的顺序一定是变量先于初始块吗?继续演示!

public class TestOrder {
    private static A a = new A();
    static {
        System.out.println("static block");
    }
    private static B b = new B();
    public static void main(String[] args) {
        new TestOrder();
    }
}
class A {
    public A() {
        System.out.println("static field A");
    }
}
class B {
    public B() {
        System.out.println("static field B");
    }
}

程序输出:

static field A
static block
static field B

可以得出以下结论,单类的初始化顺序为:

静态变量A > 静态初始块 > 静态变量B

所以,它们的在类中的顺序就决定了它们的初始化顺序,而不是变量一定会优先于初始块。

相关文章
|
8天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
54 1
|
8天前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
91 1
|
8天前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
64 1
|
8天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
43 1
|
14天前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
162 5
|
18天前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
143 3
|
21天前
|
Java
怎么用Java 代码示例来展示继承的实现
本文通过Java代码示例展示继承机制:Animal为父类,Cat和Dog继承其属性与方法,并实现构造函数调用、方法重写与特有功能扩展,体现代码复用与多态特性。
64 4
|
22天前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
230 0
|
26天前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
173 101
|
26天前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
213 100

热门文章

最新文章