知识点 2:面向对象 —— 封装 (Encapsulation)
1. 核心理论:什么是封装?
封装是面向对象编程的三大特性之首(另外两个是继承和多态)。
- 定义: 指将对象的数据(属性)和行为(方法)捆绑(bundle)在一起,形成一个独立的、不可分割的单位——类(Class)。
- 核心思想: 数据隐藏(Data Hiding)。即隐藏对象内部的复杂细节和实现过程,只对外暴露有限的、安全的公共接口(public methods),来与外部进行交互。
- 实现方式: 主要通过 访问修饰符 来实现。最常用的就是将属性设为
private(私有的),将方法设为public(公共的)。
2. 深度剖析:为什么封装很重要?
- 安全性 (Security): 保护数据不被外部代码随意篡改。例如,外部不能直接修改银行账户的余额,必须通过
deposit()或withdraw()方法,这些方法内部可以加入安全校验逻辑(比如取款金额不能大于余额)。 - 易用性 (Simplicity): 隐藏了内部的复杂性。就像我们开车,只需要踩油门、刹车,而不需要关心发动机、变速箱的复杂工作原理。封装让类的使用者可以像操作“黑盒”一样,简单、方便。
- 可维护性 (Maintainability): 当你需要修改一个类的内部实现时,只要它的公共接口(方法名、参数、返回值)保持不变,任何使用到这个类的外部代码都不需要做任何修改。这大大降低了代码的维护成本和耦合度。
3. 生活中的例子与代码示例:银行账户
封装最好的例子就是一个银行账户。
-
生活比喻: 你的银行存款(数据)是私密的,你不会让任何人直接伸手到你的钱包里拿钱。如果你想存钱或取钱,必须通过银行柜台或 ATM 机(公共方法)。ATM 机有自己的规则,比如取钱不能超过余额,不能取负数。这个 ATM 机就是封装的体现。
-
核心代码示例: 下面的
BankAccount类就很好地演示了封装。
package com.study.oop;public class BankAccount {// 1. 数据隐藏:使用 private 修饰符,将账户余额设为私有。// 外部无法直接访问或修改这个变量。private double balance;private String accountHolder;public BankAccount(String accountHolder, double initialBalance) {this.accountHolder = accountHolder;if (initialBalance > 0) {this.balance = initialBalance;}}// 2. 公共接口:提供 public 方法来操作数据。/*** 存款方法* @param amount 存款金额*/public void deposit(double amount) {// 在方法内部可以添加校验逻辑,保证数据的安全性if (amount > 0) {balance += amount;System.out.println("存款 " + amount + " 成功。当前余额: " + balance);} else {System.out.println("存款金额必须大于0。");}}/*** 取款方法* @param amount 取款金额*/public void withdraw(double amount) {// 同样,内部有安全校验if (amount > 0 && amount <= balance) {balance -= amount;System.out.println("取款 " + amount + " 成功。当前余额: " + balance);} else {System.out.println("取款失败。金额无效或余额不足。");}}/*** 获取余额的方法 (getter)* 这是唯一一个能“读取”余额的公共途径。* @return 当前余额*/public double getBalance() {return balance;}public String getAccountHolder() {return accountHolder;}// 注意:我们没有提供一个 public 的 setBalance(double newBalance) 方法,// 这就从根本上杜绝了外部直接修改余额的可能性,完美体现了封装的保护作用。
}