6.1 类、对象与封装
面向对象编程(object-oriented programming, OOP)把程序中的事物建模成对象(object)。对象既保存数据,也提供行为。类(class)是对象的模板,对象是类的实例(instance)。
类与对象
下面的 BankAccount 类表示银行账户。owner、account、balance 是字段(field),deposit() 和 withdraw() 是方法(method)。
java
class BankAccount {
String owner;
String account;
double balance;
void deposit(double amount) {
balance += amount;
}
void withdraw(double amount) {
balance -= amount;
}
}
public class BankAccountDemo {
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);
}
}运行结果:
text
余额:150.0调用 account.deposit(100) 时,方法会作用在当前的 account 对象上。如果方法里需要明确表示当前对象,Java 使用 this。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
封装
封装(encapsulation)是指隐藏对象内部实现,让外部通过明确的方法访问和修改对象状态。
如果账户余额可以被外部随便改,程序就很难保证数据正确。因此,更好的做法是让余额成为私有字段,并通过方法进行检查。
正在加载交互实验...
java
class BankAccount {
private String owner;
private 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;
}
}私有字段(private field)并不是为了“神秘化代码”,而是为了把状态变化集中在可信的方法里。
正在加载概念检查...
构造方法
构造方法(constructor)会在使用 new 创建对象时自动调用。
java
BankAccount account = new BankAccount("Alice", "6250941006528599", 50);构造方法常用于给对象设置初始状态。如果对象一创建就应该拥有某些字段,就应该在构造方法中初始化它们。
正在加载概念检查...
正在加载本节练习...