谁管它:局部变量归方法管,成员变量归对象管,静态变量归类管;放哪:局部变量在栈,对象及成员变量在堆,静态变量在方法区;啥时候来又啥时候走:局部变量随方法进出,成员变量随对象生灭,静态变量随类加载与程序退出。

直接用“谁管它、放哪、啥时候来又啥时候走”这三句话,就能把变量内存分配讲清楚。初学者不需要背术语,关键是建立直观画面感——比如想象变量是快递,堆是仓库,栈是前台小桌,方法区是公司档案室。
先分清三类变量:谁管它?
教的时候别一上来就堆栈方法区,先问学生:“这个变量归谁管?”答案只有三个:
- 局部变量:归方法管(写在方法里、for里、if里,包括参数)。它就像会议桌上临时放的笔,会散会就收走。
- 成员变量:归对象管(写在类里、方法外,没加 static)。它像每个员工工位上的水杯——人来了才有,人走了就清空。
- 静态变量:归类管(加了 static)。它像公司门口的招牌——类一加载就挂上,整个程序运行期间一直挂着,不依赖任何对象。
再对应三块内存:放哪?
每类变量有固定“住址”,不用记英文,用生活比喻:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 栈(Stack):方法的“前台小桌”。只放局部变量本身(int a = 5 → 桌上直接摆个数字5;String s = "hi" → 桌上只摆一张写着“仓库3楼B区”的纸条)。
- 堆(Heap):对象的“大仓库”。所有 new 出来的对象、数组、以及它们的成员变量,都住这里。“hi”这个字符串内容、Person 对象里的 name 和 age 值,全在这儿。
- 方法区 / 元空间(Method Area / Metaspace):类的“档案室”。只存类结构、static 变量、常量池(比如字符串字面量"hi"第一次出现时也进这里,但 JDK 7+ 后实际存堆中,教学时可简化说“归类管,统一存档”)。
最后盯紧生命周期:啥时候来、啥时候走?
用时间线对比讲,学生最容易混淆的就是“变量消失”和“对象消失”的区别:
- 局部变量:方法开始执行时“上桌”,方法结束(哪怕抛异常)立刻“收走”——不等 GC,也不留痕迹。
- 成员变量:跟着对象一起“入住仓库”,对象被 new 出来时它就有了;对象没人引用了,GC 才可能回收整个对象(连带它的所有成员变量)。
- 静态变量:类加载时“挂牌上岗”,程序退出才“摘牌下班”。创建100个对象,static 变量还是那一份,不是100份。
一个例子串起全部(课堂板书推荐)
写两行代码现场画图:
Person p = new Person();p.name = "张三";
- p 是局部变量 → 存栈上(一张纸条,写着“堆里某地址”)
- new Person() 创建的对象 → 整个存在堆里
- p.name 是成员变量 → 就在那个堆里的 Person 对象内部
- 如果 Person 有个 static int count; → 它不在堆里,也不在栈里,而是在类档案室(方法区),所有 Person 对象共享同一个 count
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










