11 面向对象思想入门

目录

  • [🔵 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                │
└─────────────────────────────┘    └─────────────────────────────┘

步骤分解

  1. new Student() → 在内存中分配空间,创建对象,成员变量赋默认值
  2. Student stu = ... → 在 内存中声明引用变量 stu,存储堆中对象的地址
  3. stu.name = "张三" → 通过地址找到堆中的对象,给 name 赋值
  4. 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 局部变量 位置、默认值、内存、生命周期、作用范围

练习题

  1. 定义一个 Dog 类,包含属性(name、age、breed)和方法(bark、eat),并在测试类中创建两个对象调用方法。
  2. 画出以下代码的内存图:
java 复制代码
Dog d1 = new Dog();
Dog d2 = d1;
d1.name = "旺财";
System.out.println(d2.name); // 输出什么?为什么?

💬 互动时间

  • 你理解的面向对象和面向过程最大的区别是什么?
  • 在你的日常开发中,用过哪些面向对象的特性?

📢 下篇预告12-封装与构造方法 ------ 学习如何用 private 保护数据安全,以及构造方法的妙用!


📚 参考资料

相关推荐
拽着尾巴的鱼儿1 小时前
lombok.RequiredArgsConstructor bean 注入
java·lombok
铁链鞭策大师1 小时前
JavaEE之多线程
java·开发语言·java-ee
摇滚侠1 小时前
Maven 入门+高深 jar 包冲突 167-171
java·maven·jar
我是唐青枫1 小时前
Java Optional 实战指南:优雅处理空值与链式转换
java·开发语言
摇滚侠1 小时前
SpringBoot 升级,依赖冲突如何解决
java·spring boot·spring
jack@london1 小时前
eclipse启动tomcat6时报错OutOfMemoryError: PermGen space
java·ide·eclipse
小江的记录本1 小时前
【JVM虚拟机】类加载机制:类加载器、双亲委派模型、好处、破坏双亲委派的场景(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
李少兄1 小时前
Spring 对象创建范式:依赖注入与直接实例化的边界抉择
java·后端·spring
小马爱打代码1 小时前
Spring源码中的设计模式实战:从理论到源码的深度解析
java·spring·设计模式