返回博客

static静态

分类:学习记录 作者:樱振宇 发布时间:2026-06-17 09:38:01
静态存储区
静态方法的内容需要和静态变量深度绑定
静态方法不能使用非静态成员(因为程序员一开始静态方法就在了,非静态变量可能还没有被分配到内存)
类必须被实例化(new)才会有对象,才会做为模板在堆是分配了具体内存。
静态类不可被实例化,静态类中只能包含静态成员或者静态方法。

微信图片_20260620005302_12_2
微信图片_20260620005306_13_2
微信图片_20260620005309_14_2
微信图片_20260620005310_15_2
微信图片_20260620005313_16_2
全局共享数据:所有对象共用同一份静态变量,一处修改全部生效(计数器、全局配置)
工具工具类:不需要对象状态,纯计算逻辑(Math、Convert、工具 Helper),直接类名调用,不用 new
静态方法只能访问静态变量 / 静态方法,不能直接用实例成员(没有对象,找不到实例数据)
屏幕截图 2026-06-17 093732
-静态成员(静态字段 / 静态方法)
✅ 优点
无需实例化,调用简单
不用 new 创建对象,直接 类名.xxx,工具类调用极其方便(Math.Abs())。
内存占用低
静态变量全局只分配一份内存,所有对象共用,大量创建实例时节省内存。
全局共享状态
所有实例共用同一份静态数据,适合做计数器、全局配置、全局缓存。
生命周期长
程序启动加载类时初始化,程序退出才销毁,可长期保存全局数据。
❌ 缺点
无法访问实例成员
静态方法没有 this,不能直接使用实例字段、实例方法,只能操作静态内容。
全局共享有线程安全问题
多线程同时修改静态变量会出现数据错乱,必须加锁处理,开发成本变高。
耦合度高,不利于单元测试
静态方法硬编码依赖全局静态变量,无法注入模拟对象,Mock 测试很难做。
无法多副本隔离数据
静态数据全局唯一,不能做到每个任务独立一份数据,并发业务容易互相污染。
生命周期长易内存泄漏
静态对象常驻内存,引用大资源(文件流、网络连接、Bitmap)会导致内存无法释放。
不支持面向对象多态
静态方法不能被 override 重写,无法实现多态特性。

实例成员(普通字段 / 普通方法,无 static)
✅ 优点
数据隔离,互不干扰
每个 new 的对象拥有独立字段,修改 A 对象不会影响 B 对象,天然无并发污染。
完整支持面向对象特性
可以使用 this、继承、virtual/override 多态、接口、封装,符合 OOP 设计思想。
访问权限自由
实例方法既能访问实例字段,也能直接访问静态成员,使用限制少。
生命周期可控,不易内存泄漏
对象不用时失去引用,GC 垃圾回收自动释放内存,资源好管理。
便于单元测试、依赖注入
可创建不同实例传入模拟参数,轻松 Mock、解耦业务逻辑。
❌ 缺点
每次使用都要实例化
频繁 new 对象会产生大量临时垃圾对象,频繁创建销毁会增加 GC 压力。
多实例内存开销大
创建大量对象时,每个对象都独立分配字段内存,占用更多堆空间。
无法直接共享数据
不同实例之间数据隔离,想要全局统计需要额外写静态变量中转。

补充:静态 vs 实例 内存占用完整分析
一、静态内存优势(少占内存的场景)
静态字段全局仅 1 份,在程序加载类时分配,全程只存一份数据。
如果一段逻辑不需要独立状态,只是纯计算工具(如字符串处理、数学计算),写成静态工具类不用反复 new 对象,省去大量实例对象的堆内存开销。
示例:1000 次调用加密工具
静态写法:全程只有 1 份工具类内存;
实例写法:每次 new 都会在堆创建对象,产生 1000 份实例,加重 GC。
二、静态内存致命缺点(多数业务场景反而更耗内存 / 难释放)
1. 静态内存常驻内存,无法主动回收
实例对象:失去引用后 GC 自动清理,内存即时释放;
静态变量:类加载后直到程序退出才销毁,哪怕不再使用也不会回收。
若静态持有大资源(图片、文件句柄、数据库连接、页面上下文),资源永久占用,造成内存泄漏、OOM;
比如 Android 里静态存 Activity,页面关闭后页面资源无法释放,APP 越用越卡。
2. 可变静态数据会强制长期持有大量数据
如果你用静态存储业务列表、用户缓存,这份数据会全程留在内存;
而实例对象用完即可丢弃,内存可释放。
3. 实例并非一定费内存
很多人误以为实例一定更占内存,分两种情况:
1)无状态工具场景:静态更省内存(推荐静态);
2)实体业务场景(用户 / 订单 / 商品):必须实例,静态反而完全不能用
每个用户有独立姓名、年龄,静态只有一份数据,多个用户数据会互相覆盖,根本无法实现业务;
此时只能 new 多个实例,内存开销是业务刚需,不可避免。
三、一句话总结内存层面取舍
纯工具、无状态、无大型缓存资源 → 静态,节省内存;
实体类、带独立数据、持有文件 / 页面 / 网络资源、多并发业务 → 用实例,静态会造成内存泄漏、资源长期占用,得不偿失。