news 2026/6/25 20:56:04

静态代码块和非静态代码块有什么区别?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
静态代码块和非静态代码块有什么区别?

一、核心区别先理清

先通过一张表格直观对比核心差异:

特性静态代码块(static {})非静态代码块({})
归属属于「类」本身属于「对象」(实例)
执行时机类加载时执行,且只执行一次创建对象时执行,每创建一个对象就执行一次
访问权限只能访问静态成员(静态变量 / 方法)可访问静态 + 非静态成员
执行优先级最高(类加载即执行)介于静态代码块和构造方法之间

二、代码示例:直观看差异

下面通过完整代码,展示两者的执行时机、次数和访问权限差异:

java

运行

public class BlockDemo { // 静态变量 static String staticVar = "静态变量初始值"; // 非静态变量 String instanceVar = "实例变量初始值"; // 1. 静态代码块 static { System.out.println("【静态代码块执行】"); // 静态代码块可访问静态变量 staticVar = "静态代码块修改后的静态变量"; System.out.println("静态变量值:" + staticVar); // 静态代码块不能直接访问非静态变量(编译报错) // instanceVar = "错误示例"; } // 2. 非静态代码块(实例代码块) { System.out.println("【非静态代码块执行】"); // 非静态代码块可访问非静态变量 instanceVar = "非静态代码块修改后的实例变量"; // 也可访问静态变量 staticVar = "非静态代码块再次修改静态变量"; System.out.println("实例变量值:" + instanceVar); System.out.println("静态变量值:" + staticVar); } // 3. 构造方法 public BlockDemo() { System.out.println("【构造方法执行】"); } public static void main(String[] args) { System.out.println("===== 创建第一个对象 ====="); BlockDemo obj1 = new BlockDemo(); System.out.println("\n===== 创建第二个对象 ====="); BlockDemo obj2 = new BlockDemo(); } }
输出结果:

plaintext

【静态代码块执行】 静态变量值:静态代码块修改后的静态变量 ===== 创建第一个对象 ===== 【非静态代码块执行】 实例变量值:非静态代码块修改后的实例变量 静态变量值:非静态代码块再次修改静态变量 【构造方法执行】 ===== 创建第二个对象 ===== 【非静态代码块执行】 实例变量值:非静态代码块修改后的实例变量 静态变量值:非静态代码块再次修改静态变量 【构造方法执行】
关键结论:
  1. 静态代码块只执行 1 次(类加载时),无论创建多少对象都不会重复执行;
  2. 非静态代码块每创建 1 个对象就执行 1 次,且执行在构造方法之前;
  3. 非静态代码块可以修改静态变量(但不推荐),修改后所有对象共享这个变化。

三、各自的典型使用场景

1. 静态代码块的适用场景
  • 初始化静态资源:比如加载配置文件、初始化静态常量、注册驱动(如 JDBC 的Class.forName());
  • 执行只需要做一次的操作:比如初始化工具类的静态缓存数据。

示例(加载配置):

java

运行

public class ConfigUtil { static Properties props; // 静态代码块加载配置文件(只加载一次) static { props = new Properties(); try { props.load(ConfigUtil.class.getResourceAsStream("/config.properties")); } catch (IOException e) { e.printStackTrace(); } } // 静态方法获取配置 public static String getConfig(String key) { return props.getProperty(key); } }
2. 非静态代码块的适用场景
  • 提取多个构造方法的公共初始化逻辑:避免构造方法中重复写相同代码;
  • 初始化实例变量:在构造方法执行前,对实例变量做统一处理。

示例(简化构造方法):

java

运行

public class User { private String name; private int age; private Date createTime; // 非静态代码块:所有构造方法共用的初始化逻辑 { createTime = new Date(); // 无论哪个构造方法,创建对象时都初始化创建时间 System.out.println("用户对象开始初始化"); } // 构造方法1 public User() { this.name = "默认名称"; this.age = 18; } // 构造方法2 public User(String name, int age) { this.name = name; this.age = age; } }

总结

  1. 执行时机是核心差异:静态代码块「类加载时执行一次」,非静态代码块「每次创建对象都执行」;
  2. 访问权限不同:静态代码块仅能操作静态成员,非静态代码块可操作所有成员;
  3. 使用场景不同:静态代码块用于类级别的一次性初始化,非静态代码块用于对象级别的重复初始化(简化构造方法)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 20:16:54

【Django毕设全套源码+文档】基于Django的“农场主”特色农产品直卖网站设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/17 22:28:29

DeepSeek-R1-Distill-Qwen-14B:14B推理模型性能大突破

DeepSeek-R1-Distill-Qwen-14B:14B推理模型性能大突破 【免费下载链接】DeepSeek-R1-Distill-Qwen-14B 探索推理新境界,DeepSeek-R1-Distill-Qwen-14B模型以创新强化学习技术,实现思维自主演进,性能逼近顶尖水平,为研究…

作者头像 李华
网站建设 2026/6/18 12:49:35

如何使用JavaScript操作DOM节点的属性?

一、核心概念:DOM 属性的两类形式 在操作前先分清两个易混概念,避免踩坑: HTML 原生属性:标签上写的属性(如id"box"、src"img.jpg"、class"content");DOM 对象…

作者头像 李华
网站建设 2026/6/24 8:53:06

3大创新突破!医疗影像分割的AI变革

3大创新突破!医疗影像分割的AI变革 【免费下载链接】Medical-Transformer Official Pytorch Code for "Medical Transformer: Gated Axial-Attention for Medical Image Segmentation" - MICCAI 2021 项目地址: https://gitcode.com/gh_mirrors/me/Medi…

作者头像 李华
网站建设 2026/6/25 18:17:36

2026 网安转行建议!零基础到精通全拿捏

在当前就业形势下,不少朋友咨询过龙哥,询问转行能否转行网络安全。网络安全作为一个热门领域,自然也吸引了许多人的目光。本文将就转行网络安全这一话题,提供一些切实可行的建议。 网络安全行业概况 网络安全涵盖了从基础的脚本编…

作者头像 李华
网站建设 2026/6/25 20:01:49

构建安全隔离的数据处理环境:MinerU离线部署技术白皮书

构建安全隔离的数据处理环境:MinerU离线部署技术白皮书 【免费下载链接】MinerU A high-quality tool for convert PDF to Markdown and JSON.一站式开源高质量数据提取工具,将PDF转换成Markdown和JSON格式。 项目地址: https://gitcode.com/GitHub_Tr…

作者头像 李华