当前位置: 首页 > news >正文

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

一、核心区别先理清

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

特性静态代码块(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. 使用场景不同:静态代码块用于类级别的一次性初始化,非静态代码块用于对象级别的重复初始化(简化构造方法)。
http://www.jsqmd.com/news/308482/

相关文章:

  • 【Django毕设源码分享】基于Django的大学生心理健康管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 【开题答辩全过程】以 基于Java的图书馆座位预约管理系统设计为例,包含答辩的问题和答案
  • 2026年1月智能AI客服服务商推荐排行榜单:五大服务商深度对比与评测
  • 探索AI视频生成:高效工作流搭建与实战指南
  • Skills3技能库:全方位提升开发效能的集成解决方案
  • 如何用AI游戏算法实现2048智能决策?探索游戏AI的核心技术与应用
  • 【开题答辩全过程】以 基于Java的网络问题投诉处理系统为例,包含答辩的问题和答案
  • 导师推荐9个AI论文写作软件,本科生轻松搞定毕业论文!
  • Django测试客户端(Client)详解:模拟浏览器请求
  • 【独立站神器】1688 详情页“长图”太长怎么翻?揭秘 AI 如何一键搞定 10000px 超长海报,无需切图!
  • 龙牙战术服装联系方式:消费者联系途径与选购注意事项
  • 【家居卖家痛点】沙发尺寸图全是中文?揭秘 AI 如何一键“cm 转 inch”并修复背景,退货率直降 30%!
  • 压滤机整机专业制造商哪家好,快来一探究竟
  • 2026年全国假发品牌哪家好? 聚焦高端定制与优质个性化场景化需求
  • 2026年薄膜压力传感器加工厂推荐,口碑好的品牌有哪些
  • 2026年口碑卓越的靠谱装修公司TOP10,昆明这些企业上榜
  • DriverManager、DataSource、数据库驱动以及数据库连接池的关系 - 指南
  • 2026年行业内好用的自动化立体仓库实力厂家推荐排行榜,立体仓储/立体仓库/自动化仓库,自动化立体仓库定做厂家推荐
  • 2026广东最新沉香手串/棋楠沉香厂家推荐广州千臻香业有限公司:源头直供,全链保障,这家广州企业实力出圈
  • 2026年比较好的美容美发培训学校,为你揭秘行业Top10
  • 总结系统门窗加盟,科典门窗在山西的性价比和口碑排名如何?
  • 字画回收乱象频发 藏家如何避坑?北京这家机构给出专业指引
  • 龙牙战术服装联系方式:产品选购与官方渠道使用指南
  • 2026年日照婚礼酒店推荐,停车方便的靠谱品牌有哪些
  • 龙牙战术服装联系方式:获取品牌支持与注意事项提示
  • 深圳市键键通科技有限公司联系方式:如何有效获取官方服务指引
  • 告别数据库变更混乱:用 Bytebase 打造 GitLab 式数据库 DevOps 平台
  • 深圳市键键通科技有限公司联系方式:官方信息核实与使用建议
  • 微信聊天记录备份与个人数据管理全攻略:3种高级导出策略与安全实践
  • Cursor试用期重置技术解析:突破限制的深度指南