java成员变量存于堆中对象内存块内,每个new对象独占一份;通过栈中引用指向堆地址访问;static变量在方法区共享;访问受修饰符控制,null引用会触发nullpointerexception。

Java 成员变量的访问,本质是通过引用找到堆中对象的实际内存位置,再读取或修改其中的数据。关键不在“怎么写语法”,而在于“谁在哪儿、怎么连上”。
成员变量存在哪儿?堆里各占一份
每个用 new 创建的对象,都在堆内存中分配独立空间;它的所有非 static 成员变量(即实例变量)就直接存放在这个对象块里。比如:
Person p1 = new Person();
Person p2 = new Person();
即使两个对象类型相同,p1.age 和 p2.age 是两份独立数据,互不影响。
怎么找到它?靠栈里的引用指向堆地址
声明变量如 Person p1; 时,p1 本身只是栈中的一个“名字”,不存数据,只存地址。执行 new Person() 后,JVM 在堆中划出一块内存,把成员变量默认值(int 为 0,Object 为 null)填进去,再把这块内存的地址赋给 p1。后续写 p1.name = "张三";,就是顺着这个地址找到堆中对应位置,把字符串引用写进去。
static 成员变量是例外:不属对象,属类
被 static 修饰的成员变量不随对象创建而复制,而是存在方法区,整个类只有一份。所有实例共享它,修改任一实例的 static 变量,其他实例立刻可见。访问时推荐用 类名.变量名(如 Person.count),避免误以为它是某个对象私有的。
访问权限决定能不能“看见”和“碰”
成员变量能否被访问,由修饰符严格控制:
- private:只能在本类内部使用;外部需通过 public 的 getter/setter 方法间接操作
- 默认(包级):同个包内的类可直接访问
- protected:同包 + 子类(即使跨包)可访问
- public:任何地方都能用对象打点访问,但实际开发中慎用,破坏封装性
不复杂但容易忽略:即使语法能通过(比如子类访问 protected 变量),若运行时对象为 null,仍会抛出 NullPointerException——因为引用没真正连上堆里的那块内存。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











