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日

相关文章

  • Vue 2.0 服务端渲染入门介绍

    Vue 2.0 服务端渲染入门介绍 什么是服务端渲染 在传统的前端Web开发中,页面的渲染都是由浏览器进行的,也就是称作客户端渲染。当浏览器请求服务器时,服务器会将页面和静态资源一起打包成HTML、CSS和JavaScript文件,返回给浏览器进行展示。 而服务端渲染则是指在服务器端生成HTML页面,再将其返回给浏览器。这种方式可以加速首屏加载速度,提升SE…

    other 2023年6月27日
    00
  • Vue自定义指令实现弹窗拖拽四边拉伸及对角线拉伸效果

    Vue自定义指令实现弹窗拖拽四边拉伸及对角线拉伸效果攻略 1. 创建自定义指令 首先,我们需要创建一个Vue自定义指令来实现弹窗的拖拽和拉伸功能。在Vue组件中,我们可以通过v-directive指令来实现这个功能。 Vue.directive(‘resizable’, { bind: function(el, binding, vnode) { // 在这…

    other 2023年9月6日
    00
  • 浅析对Spring aware接口理解

    浅析对Spring aware接口理解 引言 在Spring框架中,有一组名为aware接口的接口,它们提供了一种机制,用于在Spring容器中注册的bean中获取Spring容器和其他Spring相关对象的引用。这些接口允许我们在应用程序中执行一些特殊的操作,如获取Spring上下文对象、获取环境配置等。本文将对Spring aware接口进行浅析,并提供…

    other 2023年6月28日
    00
  • 电脑高手常用技巧应用全接解

    电脑高手常用技巧应用全接解 作为一名电脑高手,掌握一些常用技巧可以帮助我们更加高效地使用电脑。以下是电脑高手常用技巧应用全接解的详细攻略: 一、清理系统垃圾 随着我们在电脑上进行各种操作,系统会产生大量垃圾文件,日积月累会占用相当大的磁盘空间,导致电脑运行变慢。因此,我们需要定期清理系统垃圾。 在Windows系统中,可以通过以下步骤清理系统垃圾: 打开“我…

    other 2023年6月25日
    00
  • Android中内存泄漏需要的注意点

    下面是详细讲解“Android中内存泄漏需要的注意点”的完整攻略。 什么是内存泄漏 内存泄漏指的是一块申请过的内存由于某种原因没有被释放,导致程序继续占用这块内存空间,从而使得操作系统认为该程序占用的内存空间较大,容易出现系统卡顿等问题。 在Android中,内存泄漏是一种常见的问题,它通常是由于开发者在代码中没有正确使用内存管理机制而导致的。解决内存泄漏问…

    other 2023年6月27日
    00
  • Win10预览版10147 32位英文ISO镜像及语言包下载

    Win10预览版10147 32位英文ISO镜像及语言包下载攻略 1. 下载Win10预览版10147 32位英文ISO镜像 首先,我们需要下载Win10预览版10147 32位英文ISO镜像。请按照以下步骤进行: 打开你的网络浏览器,访问Microsoft官方网站。 在搜索栏中输入\”Windows 10 Insider Preview ISO\”,然后按…

    other 2023年7月28日
    00
  • C++链表实现通讯录设计

    本文将详细讲解如何使用C++语言实现一个基本的通讯录系统,该系统使用链表数据结构来保存联系人信息,并能够实现基本的增、删、查、改功能。本文的目标读者是具有一定C++基础的初学者。 实现思路 我们使用链表这种数据结构来存储联系人信息,每个节点表示一个联系人,可以存储该联系人的姓名、电话、住址等信息。每个节点不仅保存着联系人信息,还保存着指向前一个节点和后一个节…

    other 2023年6月27日
    00
  • 关于c#:如何正确使用httpclientpostasync参数?

    在C#中,HttpClient是一个用于发送HTTP请求的类。其中,PostAsync方法是用于发送POST请求的方法。在本攻略中,我们将详细讲解如何正确使用PostAsync方法的参数,并提供两个示例。 使用PostAsync方法 C#中,PostAsync方法是用于发送POST请求的方法。该方法接受两个参数:请求的URL和请求的内容。以下是一个示例,演示…

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