Java中静态代码块、构造代码块、构造函数和普通代码块的区别

当在Java类中定义一个方法或者属性时,这些元素都会被封装在类体中。除了普通属性和方法,Java中还有一些特殊的代码块,包括静态代码块、构造代码块、构造函数和普通代码块。本文将介绍这些代码块的区别。

静态代码块

静态代码块的作用是在类的加载和初始化阶段执行,只会被执行一次。通常用于进行一些预处理操作,如加载驱动,数据库连接等。静态代码块使用static关键字修饰,一般位于类的顶部。

public class Demo {
    static{
        // 静态代码块
    }
}

构造代码块

构造代码块位于类中所有构造函数之前,用于在创建对象时统一进行成员变量的初始化操作。每次创建对象时都会执行构造代码块,并且在构造函数之前执行。构造代码块使用花括号包围。

public class Demo{
    {
        // 构造代码块
    }
    ...
}

构造函数

构造函数在Java中是一种特殊的方法,主要用于对象的初始化,包含了创建对象时必要的各种操作。它具有与类同名的名称,没有返回类型,并且可以有多个参数。构造函数和构造代码块一起,可以为对象属性赋初值。

public class Demo{
    public Demo(){
        // 构造函数
    }
    ...
}

普通代码块

普通代码块也称为局部代码块,作用域限定在代码块内部。通常用于在一个方法中执行当前方法所需的部分逻辑。普通代码块使用花括号包围。

public class Demo{
    public void print(){
        {
            // 普通代码块
        }
        ...
    }
}

通过上面的介绍,我们可以得出以下两个例子来进一步说明上述的四种代码块的执行顺序和作用:

public class Demo{
    static{
        System.out.println("静态代码块");
    }
    {
        System.out.println("构造代码块");
    }
    public Demo(){
        System.out.println("构造函数");
    }
    public void print(){
        {
            System.out.println("普通代码块1");
        }
        {
            System.out.println("普通代码块2");
        }
    }

    public static void main(String[] args){
        Demo demo = new Demo();
        demo.print();
    }
}

执行结果如下:

静态代码块
构造代码块
构造函数
普通代码块1
普通代码块2

从上述结果可以看出,在创建对象时,首先执行静态代码块,然后执行构造代码块,最后执行构造函数。普通代码块的执行顺序则根据代码块定义的顺序执行。

另一个例子:

public class Demo{
​    static String str;
​    {
​        System.out.println("构造代码块执行前str=" + str);
​        str = "构造代码块赋值";
​        System.out.println("构造代码块执行后str=" + str);
​    }
​    public Demo(){
​        System.out.println("构造函数执行前str=" + str);
​        str = "构造函数赋值";
​        System.out.println("构造函数执行后str=" + str);
​    }
​    public void print(){
​        {
​            System.out.println("普通代码块前str=" + str);
​            str = "普通代码块赋值1";
​            System.out.println("普通代码块后str=" + str);
​        }
​        {
​            System.out.println("普通代码块前str=" + str);
​            str = "普通代码块赋值2";
​            System.out.println("普通代码块后str=" + str);
​        }
​    }

​    public static void main(String[] args){
​        Demo demo = new Demo();
​        demo.print();
​    }
}

执行结果如下:

构造代码块执行前str=null
构造代码块执行后str=构造代码块赋值
构造函数执行前str=构造代码块赋值
构造函数执行后str=构造函数赋值
普通代码块前str=构造函数赋值
普通代码块后str=普通代码块赋值1
普通代码块前str=普通代码块赋值1
普通代码块后str=普通代码块赋值2

从结果可以看出,当对象创建时,以static关键字修饰的静态变量会首先被初始化为默认值(null0等),然后执行静态代码块,变量值被赋值为代码块的赋值值。接着,执行构造代码块块和构造函数,变量值被更新为上述两个代码块的赋值值,但是顺序是根据代码书写顺序执行的。最后,执行普通代码块,变量值也被更新为这两个普通代码块的赋值值,但是顺序同样也是根据代码书写顺序执行的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中静态代码块、构造代码块、构造函数和普通代码块的区别 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 微信开发者工具如何修改模拟器位置 微信开发者工具修改模拟器位置教程

    微信开发者工具如何修改模拟器位置 微信开发者工具提供了模拟器的功能,可以在开发过程中方便地预览和调试小程序。有时候我们需要修改模拟器的位置,以适应不同的预览场景。本文将详细讲解如何修改微信开发者工具中模拟器的位置。 步骤 步骤1:进入开发者工具 首先,我们需要进入微信开发者工具,并打开自己的小程序项目。 步骤2:打开模拟器 在开发者工具的顶部菜单栏中,可以找…

    other 2023年6月26日
    00
  • C++实现LeetCode(138.拷贝带有随机指针的链表)

    C++实现LeetCode(138.拷贝带有随机指针的链表)攻略 题意描述 给定一个链表,其中每个节点除了next指针外,还有一个random指针,指向链表中的任意节点或者null。请将该链表进行深度拷贝,并返回深度拷贝后的链表。 解题思路 方法一:哈希表 我们可以考虑定义一个哈希表,遍历原链表,建立原节点到新节点的映射关系,并在构建新链表时同时更新rand…

    other 2023年6月27日
    00
  • Python的ORM框架SQLAlchemy入门教程

    下面给出详细的Python的ORM框架SQLAlchemy入门教程: 1. 什么是SQLAlchemy SQLAlchemy是一个Python编程语言下的SQL工具和对象关系映射(ORM)库。它提供了一组介于底层SQL之上的高级抽象,使您可以在Python中轻松地执行常见的数据库操作。您可以使用它来连接到各种数据库管理系统,如:SQLite、 MySQL、O…

    other 2023年6月27日
    00
  • healthd电池battery

    以下是“healthd电池battery”的完整攻略: healthd电池battery healthd是一个Linux系统中的守护进程,它可以监控系统健康状况,包括电池状态。本攻略绍如何使用healthd来监控电池状态。 步骤1:安装healthd 在开始使用healthd之前,您需要在Linux系统中装healthd。您可以使用以下命令在Ubuntu系统…

    other 2023年5月7日
    00
  • windows10不能修改hosts解决方案(附管理员权限运行cmd的方法)

    Windows10不能修改hosts解决方案(附管理员权限运行cmd的方法) 问题描述 在 Windows 10 上,当你尝试修改 hosts 文件时,可能会收到一个错误提示,显示“你需要提供管理员权限才能更改此文件”。即使你已经以管理员身份运行了记事本或其他文本编辑器,也无法修改 hosts 文件。这是因为 hosts 文件位于系统保护区域,需要更高的权限…

    other 2023年6月26日
    00
  • 设置windows共享文件夹后不能通过用户名密码访问的解决方法

    设置Windows共享文件夹后,如果出现不能通过用户名密码访问的情况,可以通过以下步骤进行解决: 步骤一:检查网络和共享选项设置 首先,我们需要检查网络和共享选项设置是否正确。具体操作如下: 打开控制面板,选择“网络和共享中心”; 点击“高级共享设置”; 确保“网络发现”、“文件和打印机共享”、“共享文件夹的密码保护”都已经启用。 如果这些选项没有启用,需要…

    other 2023年6月27日
    00
  • 关于java:关闭阅读器后是否需要关闭inputstream

    当使用Java中的InputStream读取文件时,我们需要确保在读取完毕后关闭InputStream以释放资源。但是,当我们使用InputStream读取文件时,我们需要一些细节,特别是在关闭InputStream之前是否需要关闭阅读器。 关于Java中的InputStream和阅读器 在Java中,InputStream用于读取字节流的抽象类,而Read…

    other 2023年5月9日
    00
  • Win10 RS2更新了什么?Win10 RS2最终版本号1704首曝

    Win10 RS2更新了什么? Win10 RS2最终版本号1704首曝攻略 Win10 RS2是指Windows 10的第二个大型更新,也被称为“创意者更新”(Creators Update)。该更新引入了一系列新功能和改进,以提升用户体验和增强系统功能。下面是Win10 RS2更新的一些主要亮点: 1. 3D创作工具 Win10 RS2引入了一套强大的3…

    other 2023年8月2日
    00
合作推广
合作推广
分享本页
返回顶部