面向对象编程基础
1. 对象与类的关系
对象:
- 对象是一种特殊的数据结构,用于存储一个事物的属性和行为。
- 通过
new关键字创建,每个对象独立存在,占用内存空间。
类:
- 类是对象的模板,定义了对象的属性(成员变量)和行为(方法)。
- 一个类可以创建多个对象,对象之间数据相互独立。
示例代码:
public class Student {
// 成员变量(属性)
String name;
double chinese;
double math;
// 成员方法(行为)
public void printTotalScore() {
System.out.println(name + "的总分是:" + (chinese + math));
}
public void printAverageScore() {
System.out.println(name + "的平均分是:" + (chinese + math) / 2.0);
}
}
2. 对象的内存分配
Java 程序运行时,内存分为三个核心区域:
2.1 方法区(Method Area)
- 存储内容:
- 类的结构信息(如类名、方法代码、静态变量、常量池)。
- 每个类的
.class文件加载到内存后,相关信息存放在方法区。
- 特点:
- 所有线程共享此区域。
- JDK8 后,方法区由元空间(Metaspace)实现,不再使用永久代(PermGen)。
示例:
// Student 类的代码、方法定义等存储于方法区
Student s1 = new Student(); // 类信息已加载到方法区
2.2 堆内存(Heap)
- 存储内容:
- 对象实例(如
new Student()创建的对象)。 - 对象的成员变量值(如
name、chinese、math)。
- 对象实例(如
- 特点:
- 所有线程共享此区域。
- 垃圾回收器(GC)负责管理堆内存的回收。
示例:
Student s1 = new Student();
// s1 的实际对象数据存储在堆内存中
// 成员变量 name、chinese、math 的值也存储在堆中
2.3 栈内存(Stack)
- 存储内容:
- 方法调用的局部变量(如基本类型变量、对象引用地址)。
- 每个线程有独立的栈内存。
- 特点:
- 方法执行时,栈帧入栈;执行完毕,栈帧出栈。
- 对象引用变量(如
s1)存储的是堆内存中对象的地址。
示例:
public static void main(String[] args) {
Student s1 = new Student(); // s1 是栈中的引用变量,指向堆内存中的对象
s1.name = "张三"; // 通过引用修改堆内存中的对象属性
}
3. 内存分配示例解析
以下代码的内存分配过程:
Student s1 = new Student();
s1.name = "张三";
s1.chinese = 100;
s1.math = 100;
-
方法区:
- 加载
Student.class,存储类结构信息(方法定义、静态变量等)。
- 加载
-
堆内存:
- 创建
Student对象实例,分配内存空间。 - 存储
name、chinese、math的值(如"张三",100,100)。
- 创建
-
栈内存:
- 局部变量
s1存储堆内存中对象的地址(如0x4f3f5b24)。
- 局部变量
内存示意图:
| 内存区域 | 存储内容 |
|------------|--------------------------------------------------------------------------|
| 方法区 | Student 类的代码、方法 printTotalScore() 和 printAverageScore() 的字节码 |
| 堆内存 | Student对象实例:name="张三", chinese=100, math=100 |
| 栈内存 | s1 = 0x4f3f5b24(指向堆内存中的对象地址) |
4. 对象操作的本质
- 对象引用:栈内存中的变量存储的是堆内存对象的地址。
- 成员方法调用:通过对象引用找到堆内存中的对象,再根据方法区中的方法定义执行代码。
示例:
s1.printTotalScore();
// 1. 通过 s1 的引用地址找到堆中的对象
// 2. 根据方法区中的方法代码执行逻辑
// 输出:张三的总分是:200.0
5. 总结
- 方法区:类的元数据存储中心,所有类的结构信息在此管理。
- 堆内存:对象的“仓库”,所有对象实例和成员变量值存储于此。
- 栈内存:方法的“工作台”,存储局部变量和对象引用,生命周期与方法调用绑定。
- 对象本质:通过栈中的引用操作堆中的实际数据,方法区提供行为支持。
核心原则:
- 万物皆对象:数据与行为封装在对象中,通过类模板创建。
- 谁的数据谁处理:对象负责管理自身的数据和行为,实现高内聚。
2376

被折叠的 条评论
为什么被折叠?



