面向对象编程(object-oriented programming, OOP)把程序中的事物建模成对象。对象把数据和处理这些数据的行为放在一起;类是描述共同结构与行为的模板,对象则是根据模板创建的实例。
🏠 房屋蓝图 → 房子同一蓝图能建造多栋地址、颜色不同的房子。
🍪 模具 → 饼干模具规定形状,每块饼干仍是独立实体。
📝 开户表 → 账户字段与规则相同,每个账户拥有自己的户主和余额。
类、对象、属性与方法
属性描述对象“有什么”,方法描述对象“能做什么”。多个对象可以使用同一套方法代码,但 this 让方法准确操作当前对象。
本节按“一类一个文件”组织代码,接口也单独保存。文件名与类型名一致;同一组示例的文件放在同一目录,不同组示例请使用独立目录,避免同名类互相冲突。
BankAccount.java
public class BankAccount {
String owner;
String account;
double balance;
void deposit(double amount) {
this.balance += amount;
}
void withdraw(double amount) {
this.balance -= amount;
}
}Main.java
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount();
account.owner = "Alice";
account.account = "6250941006528599";
account.balance = 50;
account.deposit(100);
System.out.println(account.balance);
}
}互动实验
账户对象工厂:同一张蓝图,不同的状态
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
类和对象的关系更接近哪一种?
知识测验
题目
调用 account.deposit(100) 时,this 指向谁?
封装与有效状态
如果余额能被任意写成负数,账户对象就进入了无效状态。封装不是把数据藏得神秘,而是把变化集中到 deposit()、withdraw() 等明确入口,由入口验证规则。private 字段只能在声明它的类中直接访问,用来减少意外的外部访问;它是一种程序设计保护机制,并不是安全加密。
构造方法
构造方法在新对象创建时自动运行。它把创建对象所需的数据一次收齐,使每个对象从诞生起就具有完整、有效的初始状态。
BankAccount.java
public class BankAccount {
private final String owner;
private final String account;
private double balance;
BankAccount(String owner, String account, double balance) {
this.owner = owner;
this.account = account;
this.balance = balance;
}
double getBalance() {
return balance;
}
boolean deposit(double amount) {
if (amount <= 0) {
return false;
}
balance += amount;
return true;
}
boolean withdraw(double amount) {
if (amount <= 0 || amount > balance) {
return false;
}
balance -= amount;
return true;
}
}互动实验
构造方法与私有状态:对象诞生的四步
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
封装的主要目的是什么?
知识测验
题目
构造方法通常在什么时候执行?
动手练习
创建三个独立的学生对象
- 定义 Student,构造参数为 name 和 score。
- 实现 add_score(points)。
- 创建三个分数不同的对象,只给其中一个加 5 分,并打印全部分数。
动手练习
实现安全的银行账户
- 余额保存为私有字段。
- deposit 只接受正数。
- withdraw 拒绝非正数和透支。
- 完成两次合法操作和一次失败操作,打印返回值与余额。
动手练习
封装温度计
- Thermometer 用私有字段保存摄氏温度。
- set_celsius 拒绝低于 -273.15 的值。
- 提供 get_celsius() 和 get_fahrenheit()。
- 测试一次合法值和一次非法值。