Day 30.Java面向对象原理

今日
Java中对象的内存分配
一、内存分区(基础)
Java 执行对象创建主要用到 栈内存、堆内存、方法区
栈内存(虚拟机栈)
存放局部变量、对象引用地址(Student s只是存放堆内对象地址)
方法调用时进栈,方法执行完毕立刻释放内存,速度快
堆内存
new出来的所有实例对象、对象的成员变量全部存放在堆
GC 垃圾回收负责回收没有引用指向的堆对象
方法区
存放类的字节码、静态变量、常量
二、new 创建对象完整执行步骤(重点流程)
以 Student s = new Student(); 举例
加载 Student 类字节码进入方法区
在堆内存开辟一块空间,分配对象地址
堆里面成员变量执行默认初始化
int=0、double=0.0、boolean=false、引用类型 = null
执行构造方法,给成员变量赋值
把堆对象的内存地址,赋值给栈内引用变量 s
顺序总结:加载类 → 堆开辟空间 → 成员默认值 → 执行构造方法 → 栈保存地址
三、成员变量、局部变量内存区别
成员变量
跟随对象存放在堆内存
拥有默认初始值
生命周期:对象被 new 产生,GC 回收对象之后销毁
局部变量(方法、代码块内部)
存放在栈内存
没有默认值,使用前必须手动赋值
方法运行结束直接释放
四、多个对象、多个引用内存原理
Student s1 = new Student();
Student s2 = new Student();
plaintext
两次new,堆中生成两块独立对象,修改s1属性不会影响s2
2. ```java
Student s1 = new Student();
Student s2 = s1;
s1、s2 栈内保存同一个堆地址,两个引用指向同一个对象;任意引用修改属性,另一个读取到的数据同步变化
五、this 的内存本质
this 存储当前堆对象的地址;谁调用这个方法,this 就代表谁的地址
static 静态方法不属于对象,没有 this
明日
对象在方法中进行传递
问题及解决方案
问题 1:NullPointerException 空指针异常
成因:栈引用赋值为 null,没有 new 堆对象,就调用属性 / 方法
Person p = null;
p.name = "张三"; //报错
解决:必须执行p = new Person()实例化;调用前增加非空判断 if(p != null)
问题 2:一个引用修改对象属性,另一个跟着改动
成因:多个引用指向堆内同一个对象地址
解决:需要独立对象就必须多次 new,禁止直接引用赋值
问题 3:局部变量编译报错,提示尚未初始化
成因:栈内局部变量不存在默认初始化值
解决:使用之前手动赋值
问题 4:成员变量赋值失败,总是默认初始值
成因:变量就近原则,方法操作的是局部变量,没有访问堆里面成员变量
解决:使用this.成员变量名

posted @ 2026-08-11 17:52  CCidy  阅读(11)  评论(0)    收藏  举报