目录
- [🔵 11 面向对象思想入门](#🔵 11 面向对象思想入门)
-
- [11.1 为什么需要面向对象](#11.1 为什么需要面向对象)
- [11.2 面向过程 vs 面向对象](#11.2 面向过程 vs 面向对象)
- [11.3 类与对象的概念](#11.3 类与对象的概念)
-
- [11.3.1 什么是类(Class)](#11.3.1 什么是类(Class))
- [11.3.2 什么是对象(Object)](#11.3.2 什么是对象(Object))
- [11.3.3 类与对象的关系](#11.3.3 类与对象的关系)
- [11.4 类的定义](#11.4 类的定义)
-
- [11.4.1 语法格式](#11.4.1 语法格式)
- [11.4.2 定义一个学生类](#11.4.2 定义一个学生类)
- [11.4.3 定义一个手机类](#11.4.3 定义一个手机类)
- [11.5 对象的创建与使用](#11.5 对象的创建与使用)
-
- [11.5.1 创建对象的语法](#11.5.1 创建对象的语法)
- [11.5.2 使用对象](#11.5.2 使用对象)
- [11.5.3 完整示例](#11.5.3 完整示例)
- [11.5.4 手机对象示例](#11.5.4 手机对象示例)
- [11.6 对象的内存分析](#11.6 对象的内存分析)
-
- [11.6.1 Java内存区域](#11.6.1 Java内存区域)
- [11.6.2 内存分析示例](#11.6.2 内存分析示例)
- [11.6.3 多个对象的内存](#11.6.3 多个对象的内存)
- [11.7 成员变量与局部变量](#11.7 成员变量与局部变量)
- [11.8 本章总结](#11.8 本章总结)
- [💬 互动时间](#💬 互动时间)
- [📚 参考资料](#📚 参考资料)
🔵 11 面向对象思想入门
更新日期 :2026年5月
版权声明 :本文为原创内容,转载请注明出处。
系列:Java入门到精通系列 · 第二阶段 · 面向对象
11.1 为什么需要面向对象
在前面的学习中,我们用面向过程的方式写了很多程序:定义变量、写方法、调用方法。但当程序变得越来越复杂,代码量从几百行增长到几千行甚至上万行时,面向过程的方式会出现以下问题:
- 代码重复:相似逻辑到处复制粘贴
- 难以维护:牵一发而动全身
- 无法复用:模块之间耦合度高
面向对象编程(Object-Oriented Programming, OOP) 正是为了解决这些问题而诞生的编程思想。
11.2 面向过程 vs 面向对象
| 对比维度 | 面向过程 | 面向对象 |
|---|---|---|
| 思考方式 | 以"步骤"为中心 | 以"对象"为中心 |
| 程序结构 | 函数的集合 | 对象的协作 |
| 代码复用 | 较低 | 较高 |
| 适用场景 | 简单任务、脚本 | 复杂系统、大型项目 |
| 可维护性 | 差 | 好 |
| 典型语言 | C | Java、C++、Python |
比喻理解:
- 面向过程:"我要做一道番茄炒蛋" → 第一步切番茄 → 第二步打蛋 → 第三步炒......
- 面向对象:"我请厨师做饭" → 厨师知道怎么做 → 我只需要告诉他"做番茄炒蛋"
11.3 类与对象的概念
11.3.1 什么是类(Class)
类 是对一类事物的抽象描述 ,它定义了这类事物共有的属性 和行为。
类 = 属性(特征) + 行为(方法)
11.3.2 什么是对象(Object)
对象 是类的一个具体实例,是真实存在的个体。
11.3.3 类与对象的关系
| 概念 | 说明 | 举例 |
|---|---|---|
| 类 | 模板/蓝图 | 汽车设计图纸 |
| 对象 | 实体/实例 | 按图纸造出来的一辆辆汽车 |
📌 一句话总结:类是模板,对象是产品。一个类可以创建无数个对象。
11.4 类的定义
11.4.1 语法格式
java
public class 类名 {
// 成员变量(属性/字段)
数据类型 变量名;
// 成员方法(行为)
返回值类型 方法名(参数列表) {
方法体;
}
}
11.4.2 定义一个学生类
java
public class Student {
// ---- 成员变量(属性)----
String name; // 姓名
int age; // 年龄
String studentId; // 学号
double score; // 成绩
// ---- 成员方法(行为)----
public void study() {
System.out.println(name + "正在学习Java...");
}
public void introduce() {
System.out.println("大家好,我叫" + name + ",今年" + age + "岁,学号是" + studentId);
}
public void showScore() {
System.out.println(name + "的成绩是:" + score + "分");
}
}
11.4.3 定义一个手机类
java
public class Phone {
// 成员变量
String brand; // 品牌
String model; // 型号
double price; // 价格
boolean isOn; // 是否开机
// 成员方法
public void turnOn() {
isOn = true;
System.out.println(brand + " " + model + " 已开机");
}
public void turnOff() {
isOn = false;
System.out.println(brand + " " + model + " 已关机");
}
public void call(String phoneNumber) {
if (isOn) {
System.out.println("正在拨打:" + phoneNumber);
} else {
System.out.println("手机已关机,无法拨打电话");
}
}
}
11.5 对象的创建与使用
11.5.1 创建对象的语法
java
类名 对象名 = new 类名();
11.5.2 使用对象
java
// 访问属性:对象名.属性名
// 调用方法:对象名.方法名(参数)
11.5.3 完整示例
java
public class StudentTest {
public static void main(String[] args) {
// 创建第一个学生对象
Student stu1 = new Student();
stu1.name = "张三";
stu1.age = 20;
stu1.studentId = "2026001";
stu1.score = 92.5;
stu1.introduce();
stu1.study();
stu1.showScore();
System.out.println("------------");
// 创建第二个学生对象
Student stu2 = new Student();
stu2.name = "李四";
stu2.age = 21;
stu2.studentId = "2026002";
stu2.score = 88.0;
stu2.introduce();
stu2.study();
stu2.showScore();
}
}
输出结果:
大家好,我叫张三,今年20岁,学号是2026001
张三正在学习Java...
张三的成绩是:92.5分
------------
大家好,我叫李四,今年21岁,学号是2026002
李四正在学习Java...
李四的成绩是:88.0分
11.5.4 手机对象示例
java
public class PhoneTest {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.brand = "华为";
p1.model = "Mate 70";
p1.price = 5999.0;
p1.turnOn();
p1.call("13800138000");
p1.turnOff();
}
}
输出结果:
华为 Mate 70 已开机
正在拨打:13800138000
华为 Mate 70 已关机
11.6 对象的内存分析
理解对象在内存中的存储方式,是深入学习Java的关键。
11.6.1 Java内存区域
| 内存区域 | 作用 | 存放内容 |
|---|---|---|
| 栈(Stack) | 方法调用 | 局部变量、方法参数 |
| 堆(Heap) | 对象存储 | new出来的对象、成员变量 |
| 方法区(Method Area) | 类信息存储 | 类的字节码、静态变量、常量 |
11.6.2 内存分析示例
java
Student stu = new Student();
stu.name = "张三";
stu.age = 20;
stu.study();
执行过程:
┌──────────── 栈 ────────────┐ ┌──────────── 堆 ────────────┐
│ │ │ │
│ stu (引用变量) │───→│ Student对象 │
│ 地址: 0x001 │ │ name = "张三" │
│ │ │ age = 20 │
│ │ │ studentId = null │
│ │ │ score = 0.0 │
└─────────────────────────────┘ └─────────────────────────────┘
步骤分解:
new Student()→ 在堆内存中分配空间,创建对象,成员变量赋默认值Student stu = ...→ 在栈 内存中声明引用变量stu,存储堆中对象的地址stu.name = "张三"→ 通过地址找到堆中的对象,给name赋值stu.study()→ 通过地址找到对象,调用其study()方法
11.6.3 多个对象的内存
java
Student s1 = new Student();
Student s2 = new Student();
s1.name = "张三";
s2.name = "李四";
栈 堆
┌──────────┐ ┌──────────────────┐
│ s1: 0x001│──────→ │ Student对象 │
│ │ │ name="张三" │
│ s2: 0x002│──┐ │ age=0 │
└──────────┘ │ └──────────────────┘
│
│ ┌──────────────────┐
└──→ │ Student对象 │
│ name="李四" │
│ age=0 │
└──────────────────┘
📌 每个
new出来的对象都有自己独立的一份成员变量,互不影响。
11.7 成员变量与局部变量
| 对比维度 | 成员变量 | 局部变量 |
|---|---|---|
| 定义位置 | 类中,方法外 | 方法内部或方法参数 |
| 默认值 | 有(0、null、false等) | 无,必须先赋值再使用 |
| 内存位置 | 堆内存 | 栈内存 |
| 生命周期 | 随对象创建而生,随对象回收而亡 | 随方法调用而生,方法结束即亡 |
| 作用范围 | 整个类 | 所在方法或代码块内 |
java
public class VariableDemo {
// 成员变量 ------ 有默认值
int a; // 默认 0
String s; // 默认 null
boolean flag; // 默认 false
public void test() {
// 局部变量 ------ 没有默认值,必须赋值
int b = 10;
System.out.println(a); // 0
System.out.println(b); // 10
// int c; // 编译错误!未初始化
// System.out.println(c);
}
}
成员变量与局部变量同名
java
public class SameNameDemo {
int num = 10; // 成员变量
public void show() {
int num = 20; // 局部变量(就近原则)
System.out.println(num); // 20(局部变量优先)
}
}
11.8 本章总结
知识回顾
| 知识点 | 核心内容 |
|---|---|
| 面向对象思想 | 以对象为核心组织代码,提高复用性和可维护性 |
| 类与对象 | 类是模板,对象是实例 |
| 类的定义 | 成员变量 + 成员方法 |
| 对象创建 | 类名 对象名 = new 类名() |
| 内存分析 | 栈存引用,堆存对象,方法区存类信息 |
| 成员变量 vs 局部变量 | 位置、默认值、内存、生命周期、作用范围 |
练习题
- 定义一个
Dog类,包含属性(name、age、breed)和方法(bark、eat),并在测试类中创建两个对象调用方法。 - 画出以下代码的内存图:
java
Dog d1 = new Dog();
Dog d2 = d1;
d1.name = "旺财";
System.out.println(d2.name); // 输出什么?为什么?
💬 互动时间
- 你理解的面向对象和面向过程最大的区别是什么?
- 在你的日常开发中,用过哪些面向对象的特性?
📢 下篇预告 :12-封装与构造方法 ------ 学习如何用
private保护数据安全,以及构造方法的妙用!
📚 参考资料
- Oracle Java 官方文档 - Classes and Objects
- Java 面向对象编程(菜鸟教程)
- 《Java核心技术 卷I》第4章