首页 > 其他分享 >详解:普通代码块和static代码块

详解:普通代码块和static代码块

时间:2024-10-28 13:19:52浏览次数:8  
标签:初始化 变量 实例 代码 详解 static 执行

一、普通代码块

        在Java中,普通代码块(也称为实例初始化块或非静态初始化块)是用于在创建对象时执行代码的特殊代码块。它用于初始化实例变量或执行一些每次创建对象时都需要执行的代码。普通代码块在每次创建对象时执行,并且每次执行都会重新执行其中的代码。

普通代码块通常用于以下场景:

  1. 初始化实例变量:当实例变量需要复杂的初始化逻辑时,可以使用普通代码块。
  2. 执行每次创建对象时都需要执行的代码。

下面是一个简单的例子,演示了普通代码块的使用:

public class A {
    public  int num;
     {
         num=10;
        System.out.println("A类的代码块...");
    }
    public A(){
        System.out.println("A类的无参构造。。。");
    }

}
class Test{
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.num);
        A a2 = new A();
    }
}

结果如下:

A类的代码块...
A类的无参构造。。。
10
A类的代码块...
A类的无参构造。。。

        在这个例子中,A类有一个实例变量num和一个普通代码块。当创建A的实例时,普通代码块会被执行,初始化num变量,并打印一条消息。每次创建A的实例时,普通代码块都会执行。可以看到,构造方法A()被调用了两次,因为创建了两个实例,普通代码块也被执行了两次,因为每次创建对象时都需要执行。


二、static代码块

        在Java中,static代码块(也称为静态初始化块)是用于在类加载时执行代码的特殊代码块。它用于初始化类的静态变量或执行一些只需要执行一次的代码。static代码块在类加载时执行,并且只执行一次,无论创建了多少个该类的实例。

static代码块通常用于以下场景:

  1. 初始化静态变量:当类的静态变量需要复杂的初始化逻辑时,可以使用static代码块。
  2. 执行一次性操作:如果有一些代码只需要在类加载时执行一次,可以使用static代码块。

下面是一个简单的例子,演示了static代码块的使用:

public class A {
    public static int num;
     static{
         num=10;
        System.out.println("A类的代码块...");
    }
    public A(){
        System.out.println("A类的无参构造。。。");
    }

}
class Test{
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.num);
        A a2 = new A();
    }
}

结果如下:

A类的代码块...
A类的无参构造。。。
10
A类的无参构造。。。

       在这个例子中,A类有一个静态变量num和一个static代码块。当创建A的实例时,静态代码块会被执行,初始化num变量,并打印一条消息。无论创建了多少个A的实例,static代码块只会执行一次。

        在main方法中,我们创建了两个A的实例,可以看到,构造方法A()被调用了两次,因为创建了两个实例,但static代码块只执行了一次,因为它是在类加载时执行的。


区别:

一、定义与位置

  1. 普通代码块

    • 定义:在方法、循环、判断等语句中出现的代码块,通常用花括号{}包围。
    • 位置:可以出现在方法体内除()外的任何地方,包括方法体内部、循环体内部、判断语句内部等。
  2. static代码块

    • 定义:在类中定义并使用static关键字修饰的代码块。
    • 位置:它不能出现在方法体或者其他代码块内,只能位于类体中。

二、执行时机与生命周期

  1. 普通代码块

    • 执行时机:随着对象的创建而执行,每次创建对象时都会执行一次。也可以看作随着构造器的调用而执行,因为编译器在编译时会把普通代码块插入到每个构造函数的最前面(如果某个构造函数调用了其他的构造函数,则不会重复插入以避免执行多次)。
    • 生命周期:与对象的生命周期一致,对象存在时普通代码块中的变量也有效,对象销毁时这些变量也随之失效。
  2. static代码块

    • 执行时机:在类加载时执行,且只执行一次。无论创建多少个对象,静态代码块都只会执行一次。类加载通常发生在创建对象实例、创建子类对象(导致父类也被加载)、或使用静态成员变量时。
    • 生命周期:与类的生命周期一致,类加载时静态代码块中的变量就有效,直到类被卸载时这些变量才失效。

三、访问权限与作用域

  1. 普通代码块

    • 访问权限:可以访问类的实例变量和实例方法,以及局部变量(如果位于方法体内)。
    • 作用域:通常受限于其所在的方法、循环或判断语句的作用域。
  2. static代码块

    • 访问权限:只能直接访问类的静态变量和静态方法,不能直接访问实例变量和实例方法(需要通过类的实例对象来访问)。
    • 作用域:在整个类中都有效,因为静态代码块在类加载时就已经执行了。

总结

  • 普通代码块:随着对象的创建而执行,用于初始化实例变量或执行一些需要在对象创建时进行的操作。每次创建对象都会执行一次。
  • static代码块:在类加载时执行一次,用于初始化静态变量或执行一些需要在类加载时进行的操作。无论创建多少个对象,静态代码块都只执行一次。

标签:初始化,变量,实例,代码,详解,static,执行
From: https://blog.csdn.net/2401_83418369/article/details/143299767

相关文章

  • 详解:类什么时候加载?
            在Java编程语言中,类的加载(ClassLoading)是Java虚拟机(JVM)将类的字节码从文件或其他来源(如网络)加载到JVM(Java虚拟机)内存中,并转化为运行时数据结构(如java.lang.Class对象)的过程。这个过程通常发生在程序运行时,但也可以在特定条件下提前发生。类的加载时机取决于多......
  • 代码随想录 -- 动态规划 -- 不同路径
    62.不同路径-力扣(LeetCode)思路:dp[i][j]含义:到达第(i,j)个格子有多少种走法递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1]初始化:dp[0][j]=1:到达第一行的格子都只有一种走法;dp[i][0]=1:到达第一列的格子也都只有一种走法遍历顺序:从上到下,从左到右classSolution(object):def......
  • Flink + Kafka 实现通用流式数据处理详解
    Flink+Kafka实现通用流式数据处理详解在大数据时代,实时数据处理和分析成为企业快速响应市场变化、提高业务效率和优化决策的关键技术。ApacheFlink和ApacheKafka作为两个重要的开源项目,在数据流处理领域具有广泛的应用。本文将深入探讨Flink和Kafka的关系、它们在数据......
  • webpack打包js代码(ES6->ES5)和vue文件
    为什么需要babel?Babel命令行使用Babel插件的使用Babel的预设presetbabel-loaderbabel-preset编写App.vue代码App.vue的打包过程@vue/compiler-sfcresolve模块解析确实文件还是文件夹extensions和alias配置......
  • 川崎机器人故障报警代码维修排除方法
    川崎机器人故障排除参考方法 首先,第一时间做好系统数据备份工作。了解故障现象,通过现场一些设备的基本现象和现场技术人员的描述进行判断,这样机器人维修起来会比较有效率,。 例如,根据一位现场工程师的描述“川崎控制器偶发会产生自动重启现象,这个重启过程中会看到快要启动时,......
  • Python 的魔法搜索:如何用代码解锁淘宝商品关键字的神秘力量
    在淘宝这个充满奇迹的电商王国里,每一个商品关键字都像是一把古老的钥匙,能够解锁隐藏在茫茫商品海洋中的宝藏。今天,我们要讲述的是如何成为一名Python魔法师,用你的代码魔杖,施展搜索魔法,按关键字精准搜索商品,并获取它们的API数据。准备你的魔法工具箱:Python开发环境在这场......
  • 代码随想录算法训练营第十一天|leetcode150. 逆波兰表达式求值、leetcode239. 滑动窗
    1leetcode150.逆波兰表达式求值题目链接:150.逆波兰表达式求值-力扣(LeetCode)文章链接:代码随想录视频链接:栈的最后表演!|LeetCode:150.逆波兰表达式求值_哔哩哔哩_bilibili自己的思路:这是一道有思路,但是思路并不多的题目,就是我会觉得是先将数据进行添加,然后对于符号通过倒......
  • Python海盗的寻宝之旅:如何用代码掠夺淘宝商品关键字的宝藏?
    在淘宝这片波涛汹涌的电商大海中,商品关键字就像是藏宝图上的秘密标记,指引着勇敢的海盗们寻找隐藏在数字波涛中的宝藏。今天,我们要讲述的是如何成为一名Python海盗,用你的代码弯刀,掠夺淘宝商品关键字的宝藏——精准搜索商品的API数据。准备你的海盗装备:Python开发环境在这场寻......
  • Java界的搜索特工:如何用代码精准追踪商品关键字?
    在淘宝这个电商宇宙中,商品关键字就像是通往宝藏的神秘密码。今天,我们要讲述的是如何成为一名Java界的搜索特工,用你的代码装备,精准追踪这些关键字,揭开隐藏在数据星海中的商品秘密。准备你的特工装备:Java开发环境在这场搜索任务中,你的装备箱里需要一些基础装备:Java语言、用于......
  • 微信小程序代码包下载
    从开发者工具中导出:在微信开发者工具中,你可以通过菜单栏的“项目”选项找到“导出项目”功能。选择你要导出的项目,然后按照提示操作即可将整个项目打包成一个zip文件。这个zip文件中包含了项目的所有源代码和资源文件。从GitHub等代码托管平台获取:如果你的项目已经托管在GitHub等......