Java中的初始块执行顺序

在Java中除了使用构造器类对单个对象进行初始化操作外,我们还可以通过初始化块来实现。在一个类中可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块后执行。使用static修饰的初始化块,称为静态初始化块,在初始化块中可以定义局部变量、调用其他对象的方法,以及使用分支、循环语句等。

静态初始快:执行优先级高于非静态初始块,它会在对象装载到系统的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。

非静态初始化块:执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。

下面程序就定义了初始化块:

class Person {
    {
        int num = 25;
        System.out.println("普通初始块1");
    }
    static {
        int num = 45;
        System.out.println("静态初始块1");
    }
    {
        int num = 25;
        System.out.println("普通初始块2");
    }
    public Person() {
        System.out.println("无参构造器");
    }
}

public class MainTest {
    public static void main(String[] args) {
        new Person();
    }
}

输出结果如下:

静态初始块1
普通初始块1
普通初始块2
无参构造器

从运行结果来看,当创建Java对象时,系统总是先调用静态初始化块,之后按顺序执行普通初始化块,最后才执行构造器。静态初始化块是类相关的,用于对整个类进行初始化处理,静态初始化块也被称为类初始化块,也属于类的静态成员,因此不能访问非静态成员。

最后值得指出的是:当JVM第一次主动使用某个类时,系统会在类准备阶段为该类的所有静态Field分配内存,在初始化阶段负责初始化这些静态Field,初始化静态Field就是执行类初始化代码或者声明类Field时指定的初始值。

首先有三个概念需要了解:

一、静态初始化:是指执行静态初始化块里面的内容。

二、实例初始化:是指执行实例初始化块里面的内容。

三、构造方法:一个名称和类的名称一样的方法,特殊在于不带返回值。

我们先来看看一段程序结果:

public class Book {
    public static int booksum = 0; // 静态变量

    static { // 这是静态初始化块
        print();
        System.out.println("this is static block");
    }

    { // 实例初始化块
        System.out.println("初始化块:" + booksum);
    }

    public Book() { // 构造方法
        System.out.println("this is Book's constructor");
        booksum += 1;
    }

    public static void print() { // 静态方法
        System.out.println("this is static method");
    }

    public static void main(String[] args) {
        // Book book = new Book();
    }
}

执行结果:

this is static method
this is static block

去掉main方法中的注释,运行结果为:

this is static method
this is static block
初始化块:0
this is Book's constructor


总结:

仅从代码执行的角度来探讨Java加载类、创建对象的过程,并没有深入到JVM的机制中去。

1.一个对象第一次创建的时候,先要加载该对象所属的类,即对应的.class文件,当然如果类已经加载,再次创建该类的对象时,就不再需要重新加载类了。而一个类加载的时候,有三个部分需要加载,一个是静态变量,再然后是静态方法,然后是静态初始化块。(见到第一次执行结果就知道了,由于没有创建实例所以初始化块不执行)

2.然后开始创建该类的实例了,当然如果静态方法跟静态初始化块中有对象的创建时,就继续加载该对象的类,当然已经加载了该对象的类的话就不需要再次加载了。那么对象实例的创建过程是什么呢?首先是成员变量的引入,然后是实例初始化块,之后才是构造方法,构造方法执行完成后才算把这个对象给创建出来了。

在这个过程中,真正可以编写执行代码的有三个地方,静态初始化块、实例初始化块以及构造方法块。从以上的分析中我们可以看到,这三个代码块的执行顺序是”先类的静态初始化块,再实例初始化块,最后是执行构造方法块。也就是说,静态初始化是属于类加载的过程,所以它执行一次,而实例初始化是每个对象创建时都会执行一次,而构造方法跟实例初始化块其实差不多,不过它在实例初始化块之后执行,而且构造方法可以重载多个,执行哪个构造方法是根据你的选择来的。

看下面的代码运行结果也可得出上面的结论:

    public static void main(String[] args) {
        Book book1 = new Book();
        Book book2 = new Book();
    }

执行结果如下所示:

this is static method
this is static block
初始化块:0
this is Book's constructor
初始化块:1
this is Book's constructor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值