static成员属于类本身,随类加载而初始化并共享于所有对象;非static成员属于对象,每次new独立副本;static方法不可用this和实例成员,静态代码块在类加载时执行一次。

理解 static 关键字,关键在于厘清“类”和“对象”的关系——static 修饰的成员属于类本身,不依赖对象;而非 static 的成员才真正属于每个具体对象。
static 是“类级别”的存在
类加载进 JVM 时,static 成员(变量、方法、代码块)就已初始化并驻留在方法区(或元空间),此时还没有任何对象产生。它只有一份,被所有该类的对象共享。
- 类名可以直接调用:如 Math.PI、Collections.emptyList()
- 即使没创建对象,也能使用:比如 main 方法必须是 static,因为程序启动时根本不存在 Main 类的实例
- 修改一个地方,所有对象看到的值都变:比如 Student.school = "清华",所有 Student 实例的 school 字段值立即同步更新
非 static 才是“对象级别”的存在
实例变量和实例方法,每次 new 一个对象,就在堆内存中分配一份独立副本。它们彼此隔离,互不影响。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 每个对象有自己的状态:比如 student1.name = "张三",student2.name = "李四",名字互不干扰
- 必须通过对象调用:如 s1.getName(),没有对象就无法访问
- 可访问 this、super,能操作当前对象的所有成员(包括 static 和非 static)
static 方法里不能用 this 和实例成员
因为 static 方法不绑定任何对象,运行时根本不存在 “当前对象” 的概念。
- 直接访问本类的 static 变量或方法:允许
- 访问本类的普通变量或方法:编译报错 —— 没有对象,这些内容还没诞生
- 调用非 static 方法:必须先创建对象,再通过对象调用
静态代码块是类加载时的“初始化入口”
它不属于任何对象,只在类第一次被加载时执行一次,常用于:
- 给 static 变量做复杂初始化(比如读配置、建连接池)
- 执行仅需一次的预处理逻辑
- 多个 static 块按定义顺序依次执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










