Java类初始化顺序

原创作品,转载请注明出自xelz's blog

博客地址:http://mingcn.cnblogs.com/

本文地址:http://mingcn.cnblogs.com/archive/2010/10/20/JavaClassInitOrder.html

 

Java技术笔试及面试中常出的问题,我们总结一下

直接看例子:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//test.java
public class test{
    public static void main(String[] args) throws Exception{
        new ExtendedClass();
    }
}
 
class BaseClass {
    BaseClass() {
        print("BaseClass:Constructor");
    }
    AnotherClass ac = new AnotherClass("BaseClass:Variable");
    {print("BaseClass:Initialization Block");}
    static{print("BaseClass:Static Initialization Block");}
    static AnotherClass sac = new AnotherClass("BaseClass:Static Variable");
    public static void print(Object o) {
        System.out.println(o);
    }
}
 
class ExtendedClass extends BaseClass {
    ExtendedClass() {
        print("ExtendedClass:Constructor");
    }
    {print("ExtendedClass:Initialization Block");}
    AnotherClass ac = new AnotherClass("ExtendedClass:Variable");
    static AnotherClass sac = new AnotherClass("ExtendedClass:Static Variable");
    static {print("ExtendedClass:Static Initialization Block");}
}
 
class AnotherClass {
    AnotherClass(Object o) {
        System.out.println(o);
    }
}

 

执行结果

BaseClass:Static Initialization Block

BaseClass:Static Variable

ExtendedClass:Static Variable

ExtendedClass:Static InitializationBlock

BaseClass:Variable

BaseClass:Initialization Block

BaseClass:Constructor

ExtendedClass:Initialization Block

ExtendedClass:Variable

ExtendedClass:Constructor

可以看出,在创建一个子类对象时,执行顺序是 

父类静态初始化块及静态成员变量

子类静态初始化块及静态成员变量

父类非静态初始化块及非静态成员变量

父类构造函数

子类非静态初始化块及非静态成员变量

子类构造函数

而关于同为静态(或非静态)的初始化块和成员变量执行的先后顺序是怎样呢,

仔细看例子就可以看出,例子中既有初始化块在成员变量之前,也有成员变量在初始化块之前的情况

运行结果是按源代码书写顺序执行

其实下面的两种书写方式是等价的

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class test {
    static type t;
    static {
        someMethod();
    }
}
 
//二者等价
class test {
    static {
        type t;
        someMethod();
    }
}

 

posted @   xelz  阅读(638)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示