静态属性属于构造函数,内存位于堆中构造函数对象的自有属性,所有实例共享;实例属性属于具体对象,每次new时在堆中独立分配,各实例互不影响。

静态属性和实例属性在内存中根本不是一回事——它们不在同一块区域,也不按相同方式管理。
静态属性:挂在构造函数上,一份共享
静态属性属于类本身,直接附加在构造函数对象上。它在类定义时就初始化,只分配一次内存,所有实例共用同一个值。
- 内存位置:堆中构造函数对象的自有属性(不是原型链,也不是实例对象)
- 访问方式:只能通过 类名.属性名(如
Person.count),不能用this或实例访问 - 修改影响:改一个,所有地方看到的都是新值;没有“副本”概念
实例属性:每个对象独占一份,存在堆里
实例属性属于具体对象,每次调用 new 构造函数时,JS 引擎都会为该对象在堆中分配独立空间来存储这些属性。
- 内存位置:堆中对应实例对象的自有属性(
this.name就存在这里) - 访问方式:必须通过实例(如
person1.name),this在方法内也指向它 - 修改影响:改
person1.name不会影响person2.name,彼此完全隔离
关键区别不在“有没有 this”,而在“谁拥有它”
很多人误以为“写在 constructor 里就是实例属性,加 static 就是静态属性”,其实本质是归属关系:
- 静态属性归类(即构造函数)所有,生命周期与构造函数一致
- 实例属性归对象所有,生命周期随对象存在,垃圾回收器回收对象时一并清理
- 二者不共用内存地址,也不共享引用——哪怕值是对象,静态属性里的对象也是单例,实例属性里的对象各自 new 出来
一个直观例子
假设定义:
class Counter {<br> static total = 0;<br> constructor() { this.count = 0; }<br>}
那么:
–
Counter.total 永远只有一个整数,存于 Counter 函数对象内部;– 每个
new Counter() 都会在堆中生成一个新对象,含独立的 count 字段;– 即使创建 1000 个实例,
total 还是 1 份,count 却有 1000 份。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











