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

    文章

    2966

    浏览量

    104696
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62564
  • 静态
    +关注

    关注

    1

    文章

    29

    浏览量

    14542
  • 代码
    +关注

    关注

    30

    文章

    4778

    浏览量

    68512
  • static
    +关注

    关注

    0

    文章

    33

    浏览量

    10364
收藏 人收藏

    评论

    相关推荐

    如何查看及更改函数/函数的调用环境

    模块化设计的思想是把一些相似的功能(比如电机控制、阀控制)设计成函数函数,这样就可以反复调用。其优点是:使程序架构更加清晰,避免重复编写相似功能的代码。不过可能会产生一个疑惑:既然
    的头像 发表于 11-17 09:08 935次阅读
    如何查看及更改<b class='flag-5'>函数</b>/<b class='flag-5'>函数</b><b class='flag-5'>块</b>的调用环境

    顺序类型在中未连接

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

    pid代码执行的时间

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

    内存操作源代码

    易语言是一门以中文作为程序代码编程语言学习例程:易语言-内存操作
    发表于 06-06 17:01 1次下载

    一种新颖的复用代码精确快速溯源方法

    。对于待溯源函数,依据函数代码的simhash值快速发现相似代码,继而倒排索引潜在相似
    发表于 01-31 14:23 0次下载
    一种新颖的复用<b class='flag-5'>代码</b>精确快速溯源方法

    python基础:如何注释代码

          大家好,又到了每日学习的时间了,最近博主在和python打交道,今天我们来聊一聊python一些基础的东西,如何注释代码。        前言        编写python程序有时候
    的头像 发表于 12-26 22:03 5557次阅读
    python基础:如何注释<b class='flag-5'>代码</b><b class='flag-5'>块</b>

    组合29个简单Python代码,自动发现新算法

    本文提出了一种基于演化算法的搜索策略,将其AAD中实现。AAD可以基于Python的子集作为语法结构,组合成复杂度相对较高的程序(循环,嵌套,嵌套函数调用等),并生成可执行的Python代码
    的头像 发表于 04-19 13:47 3520次阅读

    基于差异性代码克隆的代码补全提示方法

    基于滑动窗口和带误匹配索引的匹配算法,寻找与待补全代码相似的候选代码,并对其进行特征提取、聚类和相关性排名,以此获得候选代码
    发表于 05-28 11:22 4次下载

    TIA Portal的程序保护功能实现

    注释可见,而无法显示接口参数Temp、Constant、程序代码和网段注释。此时被保护的程序也不能被修改。若使用正确的密码打开程序时,可以显示所有的接口参数、注释和程序代码。此时被
    的头像 发表于 03-14 16:35 2688次阅读
    TIA Portal的程序<b class='flag-5'>块</b>保护功能实现

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

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

    PLC编程中OB、FC、FB、DB的使用原则

    西门子新加中包含组织(OB)、函数(FB)、函数(FC)、数据(DB)
    发表于 05-24 15:01 1.5w次阅读
    PLC编程中OB<b class='flag-5'>块</b>、FC<b class='flag-5'>块</b>、FB<b class='flag-5'>块</b>、DB<b class='flag-5'>块</b>的使用原则

    Blockly@rduino:使用创建代码

    电子发烧友网站提供《Blockly@rduino:使用创建代码.zip》资料免费下载
    发表于 07-05 09:22 0次下载
    Blockly@rduino:使用<b class='flag-5'>块</b>创建<b class='flag-5'>代码</b>

    SIMATIC S7-1500 PLC函数(FB)及其应用

    函数(FB)属于自己编程的函数是一种“带内存”的。分配数据
    的头像 发表于 07-25 09:10 3234次阅读
    SIMATIC S7-1500 PLC<b class='flag-5'>函数</b><b class='flag-5'>块</b>(FB)及其应用

    调用SCL函数-事例

    在以下部分中,将在组织“Main” 中调用 SCL 函数“SCL_Best_before_date” 并互连输入和输出参数。
    的头像 发表于 08-10 09:51 853次阅读
    调用SCL<b class='flag-5'>函数</b><b class='flag-5'>块</b>-事例

    Python中什么是语句

    条件判断 语句 什么是语句呢? 语句是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句。在
    的头像 发表于 09-12 16:41 1008次阅读