0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

静态代码块、构造代码块、构造函数及普通代码块的执行顺序

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 15:40 次阅读

Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。

1、静态代码块

①、格式 在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块:

public class CodeBlock {
    static{
        System.out.println("静态代码块");
    }
}

②、执行时机 静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。后面在比较的时候会通过具体实例来证明。

③、静态代码块的作用 一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中。

④、静态代码块不能存在任何方法体中 这个应该很好理解,首先我们要明确静态代码块是在类加载的时候就要运行了。我们分情况讨论:

对于普通方法,由于普通方法是通过加载类,然后new出实例化对象,通过对象才能运行这个方法,而静态代码块只需要加载类之后就能运行了。

对于静态方法,在类加载的时候,静态方法也已经加载了,但是我们必须要通过类名或者对象名才能访问,也就是说相比于静态代码块,静态代码块是主动运行的,而静态方法是被动运行的。

不管是哪种方法,我们需要明确静态代码块的存在在类加载的时候就自动运行了,而放在不管是普通方法还是静态方法中,都是不能自动运行的。

⑤、静态代码块不能访问普通变量 这个理解思维同上,普通变量只能通过对象来调用,是不能放在静态代码块中的。

2、构造代码块

①、格式 在java类中使用{}声明的代码块(和静态代码块的区别是少了static关键字):

public class CodeBlock {
    static{
        System.out.println("静态代码块");
    }
    {
        System.out.println("构造代码块");
    }
}

②、执行时机 构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行。需要注意的是,听名字我们就知道,构造代码块不是优先于构造函数执行,而是依托于构造函数,也就是说,如果你不实例化对象,构造代码块是不会执行的。怎么理解呢?我们看看下面这段代码:

public class CodeBlock {
    {
        System.out.println("构造代码块");
    }
     
    public CodeBlock(){
        System.out.println("无参构造函数");
    }
    public CodeBlock(String str){
        System.out.println("有参构造函数");
    }
}

我们反编译生成的class文件:

图片

如果存在多个构造代码块,则执行顺序按照书写顺序依次执行。

③、构造代码块的作用 和构造函数的作用类似,都能对对象进行初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不一定每个对象建立时都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)。

利用每次创建对象的时候都会提前调用一次构造代码块特性,我们可以做诸如统计创建对象的次数等功能。

3、构造函数

1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;

2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;

3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;

4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;

4、普通代码块

普通代码块和构造代码块的区别是,构造代码块是在类中定义的,而普通代码块是在方法体中定义的。且普通代码块的执行顺序和书写顺序一致。

public void sayHello(){
    {
        System.out.println("普通代码块");
    }
}

5、执行顺序

静态代码块>构造代码块>构造函数>普通代码块

public class CodeBlock {
    static{
        System.out.println("静态代码块");
    }
    {
        System.out.println("构造代码块");
    }
    public CodeBlock(){
        System.out.println("无参构造函数");
    }
     
    public void sayHello(){
        {
            System.out.println("普通代码块");
        }
    }
     
    public static void main(String[] args) {
        System.out.println("执行了main方法");
         
        new CodeBlock().sayHello();;
        System.out.println("---------------");
        new CodeBlock().sayHello();;
    }
}

反编译生成的class文件:

图片

执行结果:

图片

我们创建了两个匿名对象,但是静态代码块只是调用了一次。

6、父类和子类执行顺序

对象的初始化顺序:

首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有构造代码块,如果有就执行父类的构造代码块,父类的构造代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有构造代码块,如果有就执行子类的构造代码块。子类的构造代码块执行完毕再去执行子类的构造方法。

总之一句话,静态代码块内容先执行,接着执行父类构造代码块和构造方法,然后执行子类构造代码块和构造方法。

父类:SuperClass.java

package com.ys.extend;
 
public class SuperClass {
    static{
        System.out.println("父类静态代码块");
    }
    {
        System.out.println("父类构造代码块");
    }
    public SuperClass(){
        System.out.println("父类构造函数");
    }
}

子类:SubClass.java

package com.ys.extend;
 
public class SubClass extends SuperClass{
    static{
        System.out.println("子类静态代码块");
    }
     
    {
        System.out.println("子类构造代码块");
    }
     
    public SubClass(){
        System.out.println("子类构造函数");
    }
     
}

测试:

public static void main(String[] args) {
    SubClass sb = new SubClass();
    System.out.println("------------");
    SubClass sb1 = new SubClass();
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • 静态
    +关注

    关注

    1

    文章

    27

    浏览量

    14481
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66771
  • static
    +关注

    关注

    0

    文章

    33

    浏览量

    10240
收藏 人收藏

    评论

    相关推荐

    Simulink代码优化-函数的设置

    的话,生成的代码就太冗长了(有多个代码的功能都一样,都是A模型)。我想把实现同一功能的多处A模型在生成代码的时候,只生成一个函数A,需要用
    发表于 05-26 13:37

    顺序类型在中未连接

    :2677- 顺序类型的节点在中未连接。警告:Xst:2677 - 顺序类型的节点在中未连接。警告:Xst:2677- 顺序类型的节点在
    发表于 03-07 14:06

    顺序类型在中未连接

    我收到了这个错误顺序类型的节点在中未连接。警告:Xst:2677- 顺序类型的节点在中未连接。警告:Xst:2677- 顺序类型的节点在
    发表于 04-10 11:32

    可以在绝对代码段中分配一个pgm内存吗?

    800H”)(在引导之外)开始。我的问题是链接器想用应用程序代码填充3D8H和800小时之间的空白空间。这是我不需要发生的。我怀疑有某种链接器脚本可以帮助告诉链接器我想做什么,但我同样乐于在引导加载程序
    发表于 09-23 09:38

    pid代码执行的时间

    直接来干货吧对于单片机来说 pid 是一个 每隔多长时间执行一次 的代码 而这个时间通常就是积分时间我们令这个代码快这个代码
    发表于 09-03 07:51

    如何使用hal库内的代码构造代码段达成流水灯

    一 使用hal库内的代码构造代码段达成流水灯的任务首先要先安装好STM32cubeMX软件。在一系列的安装后进入软件,首先点击help窗口的倒数第二个选项安装相应的依赖库,不过有可能会出现一定的报错
    发表于 11-29 07:48

    什么是构造函数?怎样去编写构造函数

    什么是构造函数?怎样去编写构造函数呢?
    发表于 02-22 08:31

    探讨一下JAVA子类调用父类构造函数

    ,"Hello");//构造函数调用必须声明在构造函数中,这行代码不注释的话会报错System.out.println("子类一个参数
    发表于 10-19 14:51

    有什么办法可以通过wifi同时更新两ESP8266板子的代码吗?

    你好!我有两 ESP8266 板(每块都连接了一个温度传感器),一在我家,另一在我父母家,所以每块都连接到不同的 wifi。有什么办法可以通过wifi同时更新两板子的
    发表于 02-22 06:12

    介绍一个使用SCL语言编写的电机控制函数

      电机控制在实际项目中经常使用,一般的电机控制程序都是具有启动、保持、停止的功能。  今天这篇文章给大家介绍一个使用SCL语言编写的电机控制函数,不但具有起保停功能,还具有反馈监视功能,可监视
    发表于 03-09 17:02

    C++课件及范例代码(中科院研究生用)

    C++课件及范例代码(中科院):对象与类,构造函数与析构函数,堆与拷贝构造函数,
    发表于 10-07 10:03 77次下载
    C++课件及范例<b class='flag-5'>代码</b>(中科院研究生用)

    Linux共享库的构造函数和析构函数

    共享库有类似C++类构造和析构函数函数,当动态库加载和卸载的时候,函数会被分别执行。一个函数
    的头像 发表于 06-22 09:18 2097次阅读
    Linux共享库的<b class='flag-5'>构造</b><b class='flag-5'>函数</b>和析构<b class='flag-5'>函数</b>

    C++:详谈拷贝构造函数

    只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造
    的头像 发表于 06-29 11:45 1918次阅读
    C++:详谈拷贝<b class='flag-5'>构造</b><b class='flag-5'>函数</b>

    SpringBoot如何实现启动过程中执行代码

    目前开发的SpringBoot项目在启动的时候需要预加载一些资源。而如何实现启动过程中执行代码,或启动成功后执行,是有很多种方式可以选择,我们可以在static代码块中实现,也可以在
    的头像 发表于 06-20 17:32 1130次阅读

    什么是静态代码分析?静态代码分析概述

    静态分析可帮助面临压力的开发团队。高质量的版本需要按时交付。需要满足编码和合规性标准。错误不是一种选择。 这就是开发团队使用静态分析工具/源代码分析工具的原因。在这里,我们将讨论静态
    的头像 发表于 07-19 12:09 924次阅读
    什么是<b class='flag-5'>静态</b><b class='flag-5'>代码</b>分析?<b class='flag-5'>静态</b><b class='flag-5'>代码</b>分析概述