跳到内容

元数据卡

  • 前置知识:第2章(变量与类型)、第5章(方法与栈)
  • 预计时间:15 分钟
  • 完成标志:能说清类与对象的区别,知道什么是引用类型

从五个数组说起

你在工坊接到了一个任务:给图书馆写一个"图书管理系统"。一本书有书名、作者、ISBN、价格、是否借出……你用五个数组来存:

java
// 一本书的信息被拆成五个数组,每一项靠下标对应
String[] bookTitles   = new String[1000];
String[] bookAuthors  = new String[1000];
String[] bookIsbns    = new String[1000];
double[] bookPrices   = new double[1000];
boolean[] bookBorrowed = new boolean[1000];

语言:Java 如何运行:放在 main 方法里编译即可

这样你添加一本书要操作五个数组,删除一本书要维护五个数组的同步,排序按书名——另五个数组全乱了。

你皱着眉头看着屏幕,老陈师傅路过,看了一眼。

"五个数组?"他笑了。"你忘了最重要的一件事——数据是有结构的。一本书就是一个整体。你不该把它的属性拆开扔进五个数组里。"

"你要做的是——先定义'书'这个概念,然后每次遇到一本书,就根据这个概念创建对应的对象。"

"这个概念叫,这个概念的具体实例叫对象。这就是面向对象编程的第一步。"

类 = 蓝图,对象 = 实物

造物主按一个模样创造了无数个人。人和人不同,但共享同一个"人的模板"。

在 Java 里,先定义"模板"(类),再根据模板造出具体的"实物"(对象):

java
// 类 = 蓝图:描述"书"应该长什么样
class Book {
    String title;       // 字段(属性)
    String author;
    String isbn;
    double price;
    boolean isBorrowed;
}

语言:Java 如何运行:保存为 Book.java,编译通过即可。不用写 main,这只是类型定义

有了蓝图,造一本真正的书:

java
public class Library {
    public static void main(String[] args) {
        Book myBook = new Book();      // ← new 关键字创建对象

        myBook.title = "Java 核心技术"; // 给对象赋值
        myBook.author = "Horstmann";
        myBook.isbn = "978-7-111-12345-6";
        myBook.price = 99.00;

        System.out.println(myBook.title); // Java 核心技术
        System.out.println(myBook.price); // 99.0
    }
}

语言:Java 预期输出Java 核心技术99.0

语法拆解Book myBook = new Book() 做了三件事——

  1. 声明一个可装 Book 地址的变量 myBook(在栈上)
  2. 在堆内存上分配 Book 对象空间,字段初始化为默认值(null0false
  3. 把堆内存地址赋给 myBook

变量不"包含"对象——它指向对象。对象在堆里,变量在栈里。

你可以创建多个对象,每个独立:

java
Book b1 = new Book();
Book b2 = new Book();
b1.title = "Java 核心技术";
b2.title = "深入理解计算机系统";
System.out.println(b1.title); // Java 核心技术
System.out.println(b2.title); // 深入理解计算机系统

b1 = null;  // 断开引用——对象等待 GC 回收

语言:Java 预期输出Java 核心技术深入理解计算机系统


差异窗口:C++ 与 Python

C++ 的对象可以在栈上(自动释放)或堆上(手动 delete);Java 对象全在堆里。

cpp
Book book;        // 栈上分配——变量直接包含对象
Book* p = new Book();  // 堆上分配——需要手动 delete
delete p;

Python 的对象可动态添加属性,不需要预先声明字段。

python
class Book:
    pass

b = Book()
b.title = "Java 核心技术"  # 动态添加,类中不需预定义

下一步

你已经学会了如何定义类、创建对象。但每次创建后都要手动给所有字段赋值——太啰嗦了。怎么在创建时一步到位?

下一节:构造方法ch07-constructors.md

Built with VitePress | Software Systems Atlas