跳到内容

元数据卡

  • 前置知识:第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;

太啰嗦。而且如果忘了给某个字段赋值,它保持默认值——null0false——可能不是你想要的。

老陈说:"你需要一个降生时的洗礼仪式——对象一被创建,就自动执行的初始化逻辑。"

构造方法——创建即初始化

构造方法是对象创建时自动调用的特殊方法:

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

Built with VitePress | Software Systems Atlas