类变量属于类、被所有对象共享,生命周期与类相同;实例变量属于对象、各有一份副本,生命周期与对象一致;类变量存于元空间、用static修饰、可通过类名访问;实例变量存于堆、无static、只能通过对象访问。

类变量和实例变量的根本区别在于“归谁所有”和“存在多久”。类变量属于类本身,一份内存被所有对象共享;实例变量属于每个对象,每 new 一个就多一份独立副本。
归属主体与生命周期不同
类变量用 static 修饰,随类加载而诞生,程序运行期间始终存在,直到类卸载;实例变量没有 static,随对象创建而分配内存,对象被 GC 回收时一同消失。
- 类变量生命周期 = 类的生命周期(从加载到卸载)
- 实例变量生命周期 = 对象的生命周期(从 new 到被回收)
- 一个类只有一份类变量,但可能有成百上千个实例变量副本
内存位置与分配时机不同
类变量存于元空间(JDK 8+)或方法区(旧版),类加载阶段就完成初始化;实例变量存于堆内存,在每次 new 对象时才分配,并在构造器执行前按声明顺序完成初始化。
- 类变量:类加载时一次性分配,不依赖对象
- 实例变量:每次 new 都重新分配,每个对象独占一份
- 改一个类变量,所有对象立即看到变化;改一个实例变量,只影响当前对象
访问方式与使用限制不同
类变量可通过 类名.变量名 直接访问,也可通过对象访问(不推荐);实例变量只能通过 对象.变量名 访问,不能用类名调用。
- 静态方法中不能直接访问实例变量(编译报错:non-static variable cannot be referenced from a static context)
- 实例方法中既能访问实例变量,也能访问类变量
- 若用对象修改类变量(如 obj.count++),实际改的是共享的那一份;但若写 obj.name = "xxx"(name 是实例变量),只改当前对象
常见用途与设计意图不同
类变量适合表达类级别的状态或资源:比如对象计数器、全局配置、工具类常量;实例变量用于描述个体特征:比如人的姓名、ID、年龄等专属属性。
- 典型类变量:public static final String VERSION = "1.0";
- 典型实例变量:private String username; private int score;
- 误用风险:把本该是实例变量的字段声明为 static,会导致多个对象互相覆盖数据
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











