元数据卡
- 前置知识:第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() 做了三件事——
- 声明一个可装
Book地址的变量myBook(在栈上) - 在堆内存上分配
Book对象空间,字段初始化为默认值(null、0、false) - 把堆内存地址赋给
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