元数据卡
- 前置知识:第7章(上)——类、字段与 this
- 预计时间:12 分钟
- 完成标志:能编写带校验的构造方法,理解默认无参构造何时消失
别再逐行赋值了
以前每创建一本书,你得手动给每个字段赋值:
java
Book b = new Book();
b.title = "Java 核心技术";
b.author = "Horstmann";
b.isbn = "978-7-111-12345-6";
b.price = 99.00;太啰嗦。而且如果忘了给某个字段赋值,它保持默认值——null、0、false——可能不是你想要的。
老陈说:"你需要一个降生时的洗礼仪式——对象一被创建,就自动执行的初始化逻辑。"
构造方法——创建即初始化
构造方法是对象创建时自动调用的特殊方法:
java
class Book {
String title;
String author;
String isbn;
double price;
boolean isBorrowed;
// 构造方法:和类同名,没有返回值(连 void 都没有)
Book(String title, String author, String isbn, double price) {
this.title = title;
this.author = author;
this.isbn = isbn;
this.price = price;
this.isBorrowed = false; // 新书默认未借出
}
}语言:Java 语法:方法名=类名、无返回类型、
new时自动执行
创建现在一步到位:
java
Book b = new Book("Java 核心技术", "Horstmann", "978-7-111-12345-6", 99.00);
Book empty = new Book(); // ❌ 编译错误!没有无参构造方法为什么报错? 一旦你定义了任何带参构造方法,Java 就不自动提供无参构造了。
默认构造 vs 手动重载
没定义任何构造方法时,Java 自动提供无参构造,字段全为默认值。想保留无参构造就显式写:
java
class Book {
String title;
Book() { } // 显式无参
Book(String title) { // 一个参数
this.title = title;
}
Book(String title, String author) { // 两个参数
this.title = title;
this.author = author;
}
}
// 三个构造都可以用:
Book b1 = new Book();
Book b2 = new Book("深入理解计算机系统");
Book b3 = new Book("Java核心技术", "Horstmann");概念:多个同名构造方法 = 构造方法重载——参数列表不同即可。编译时根据参数个数和类型决定调哪个。
构造方法中的校验
构造方法不只是赋值——你可以拒绝不合理的对象:
java
Book(String title, String author, double price) {
if (title == null || title.isEmpty()) {
throw new IllegalArgumentException("书名不能为空");
}
if (price < 0) {
throw new IllegalArgumentException("价格不能为负");
}
this.title = title;
this.author = author;
this.price = price;
}运行:
new Book("", "某", -50)运行时抛出异常,对象创建失败
差异窗口:C++ 与 Python
C++ 还有拷贝构造、移动构造和析构函数,Java 没有析构——靠 GC:
cpp
Book(const Book& other); // 拷贝构造
~Book(); // 析构——Java 不需要Python 的 __init__ 不是真正的构造方法——对象已被创建,只是初始化:
python
class Book:
def __init__(self, title, author):
self.title = title
self.author = author下一步
构造方法确保了对象创建时数据合法。但创建之后呢?b.price = -50 还是能随意破坏数据。
下一节:封装 → ch07-encapsulation.md