核心内容摘要
STM32L4xx电源监测实战:如何用PVD功能防止系统崩溃(附寄存器配置详解)
核心区别先理清先通过一张表格直观对比核心差异特性静态代码块static {}非静态代码块{}归属属于「类」本身属于「对象」实例执行时机类加载时执行且只执行一次创建对象时执行每创建一个对象就执行一次访问权限只能访问静态成员静态变量 / 方法可访问静态 非静态成员执行优先级最高类加载即执行介于静态代码块和构造方法之间
代码示例直观看差异下面通过完整代码展示两者的执行时机、次数和访问权限差异java运行public class BlockDemo { // 静态变量 static String staticVar 静态变量初始值; // 非静态变量 String instanceVar 实例变量初始值; //
静态代码块 static { System.out.println(【静态代码块执行】); // 静态代码块可访问静态变量 staticVar 静态代码块修改后的静态变量; System.out.println(静态变量值 staticVar); // 静态代码块不能直接访问非静态变量编译报错 // instanceVar 错误示例; } //
非静态代码块实例代码块 { System.out.println(【非静态代码块执行】); // 非静态代码块可访问非静态变量 instanceVar 非静态代码块修改后的实例变量; // 也可访问静态变量 staticVar 非静态代码块再次修改静态变量; System.out.println(实例变量值 instanceVar); System.out.println(静态变量值 staticVar); } //
构造方法 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 个对象就执行 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); } }
非静态代码块的适用场景提取多个构造方法的公共初始化逻辑避免构造方法中重复写相同代码初始化实例变量在构造方法执行前对实例变量做统一处理。
示例简化构造方法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; } }