面向对象基础

面向对象编程基础

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() 创建的对象)。
    • 对象的成员变量值(如 namechinesemath)。
  • 特点
    • 所有线程共享此区域。
    • 垃圾回收器(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;
  1. 方法区

    • 加载 Student.class,存储类结构信息(方法定义、静态变量等)。
  2. 堆内存

    • 创建 Student 对象实例,分配内存空间。
    • 存储 namechinesemath 的值(如 "张三", 100, 100)。
  3. 栈内存

    • 局部变量 s1 存储堆内存中对象的地址(如 0x4f3f5b24)。

内存示意图

| 内存区域   | 存储内容                                                                 |
|------------|--------------------------------------------------------------------------|
| 方法区     | Student 类的代码、方法 printTotalScore()printAverageScore() 的字节码 |
| 堆内存     | Student对象实例:name="张三", chinese=100, math=100                      |
| 栈内存     | s1 = 0x4f3f5b24(指向堆内存中的对象地址)                                |

4. 对象操作的本质
  • 对象引用:栈内存中的变量存储的是堆内存对象的地址。
  • 成员方法调用通过对象引用找到堆内存中的对象,再根据方法区中的方法定义执行代码

示例

s1.printTotalScore();  
// 1. 通过 s1 的引用地址找到堆中的对象  
// 2. 根据方法区中的方法代码执行逻辑  
// 输出:张三的总分是:200.0  

5. 总结
  • 方法区:类的元数据存储中心,所有类的结构信息在此管理。
  • 堆内存:对象的“仓库”,所有对象实例和成员变量值存储于此。
  • 栈内存:方法的“工作台”,存储局部变量和对象引用,生命周期与方法调用绑定。
  • 对象本质:通过栈中的引用操作堆中的实际数据,方法区提供行为支持。

核心原则

  • 万物皆对象:数据与行为封装在对象中,通过类模板创建。
  • 谁的数据谁处理:对象负责管理自身的数据和行为,实现高内聚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值