1481 字
约 4 分钟
8
第35章:Java封装
2026-09-24
无标签
第35章:Java封装
面包屑导航 章节头部 学习目标
学习目标
- 理解封装的概念和重要性
- 掌握Java中四种访问修饰符的使用
- 学会使用getter和setter方法
- 了解数据隐藏的原则和实现
- 掌握封装的最佳实践
- 学会设计良好封装的类
封装概念详解
Java封装概念详解
封装是面向对象编程的三大特性之一(封装、继承、多态)。封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
封装的核心思想封装的核心思想是"隐藏实现细节,只暴露必要的接口"。这样可以保护对象的内部状态,防止外部代码的不当访问和修改,同时提高代码的安全性和可维护性。
数据隐藏
- 将类的字段设为私有
- 防止外部直接访问
- 保护数据完整性
- 避免不合法的赋值
访问控制
- 使用访问修饰符控制访问
- 提供公共的访问方法
- 实现细粒度的权限控制
- 支持不同级别的封装
方法接口
- 提供getter和setter方法
- 实现数据验证逻辑
- 支持计算属性
- 保持接口稳定性
访问修饰符详解
访问修饰符详解
Java提供了四种访问修饰符来控制类、方法和变量的访问权限。理解这些修饰符的作用范围是实现良好封装的基础。
| 修饰符 | 同一类 | 同一包 | 子类 | 不同包 | 说明 |
|---|---|---|---|---|---|
| private | ✅ | ❌ | ❌ | ❌ | 只能在同一个类中访问 |
| default | ✅ | ✅ | ❌ | ❌ | 包访问权限(默认) |
| protected | ✅ | ✅ | ✅ | ❌ | 子类和同包可访问 |
| public | ✅ | ✅ | ✅ | ✅ | 所有地方都可访问 |
代码示例
完整代码示例
public class Person {
// 私有字段 - 数据隐藏
private String name;
private int age;
private String email;
// 构造方法
public Person(String name, int age, String email) {
this.name = name;
setAge(age); // 使用setter进行验证
setEmail(email);
}
// getter方法 - 提供访问接口
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getEmail() {
return email;
}
// setter方法 - 提供修改接口并进行验证
public void setName(String name) {
if (name != null && !name.trim().isEmpty()) {
this.name = name;
}
}
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
} else {
throw new IllegalArgumentException("年龄必须在0-150之间");
}
}
public void setEmail(String email) {
if (email != null && email.contains("@")) {
this.email = email;
} else {
throw new IllegalArgumentException("邮箱格式不正确");
}
}
// 计算属性 - 封装业务逻辑
public String getAgeGroup() {
if (age < 18) {
return "未成年";
} else if (age < 60) {
return "成年人";
} else {
return "老年人";
}
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age +
", email='" + email + "', ageGroup='" + getAgeGroup() + "'}";
}
}
public class BankAccount {
// 私有字段
private String accountNumber;
private double balance;
private String ownerName;
// 构造方法
public BankAccount(String accountNumber, String ownerName) {
this.accountNumber = accountNumber;
this.ownerName = ownerName;
this.balance = 0.0;
}
// 只读属性 - 只提供getter
public String getAccountNumber() {
return accountNumber;
}
public String getOwnerName() {
return ownerName;
}
public double getBalance() {
return balance;
}
// 业务方法 - 封装业务逻辑
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款成功,当前余额:" + balance);
} else {
throw new IllegalArgumentException("存款金额必须大于0");
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("取款成功,当前余额:" + balance);
} else {
throw new IllegalArgumentException("取款金额无效或余额不足");
}
}
// 查询方法
public void checkBalance() {
System.out.println("账户:" + accountNumber +
",户主:" + ownerName +
",余额:" + balance);
}
}
💻 查看完整代码 - 在线IDE体验 封装最佳实践
封装最佳实践
良好实践
- 将所有字段设为private
- 提供必要的getter/setter方法
- 在setter中进行数据验证
- 使用final修饰不可变字段
- 提供有意义的方法名
- 隐藏实现细节
- 保持接口简洁明了
避免的做法
- 将字段设为public
- 不进行数据验证
- 暴露内部实现细节
- 提供不必要的setter方法
- 返回可变对象的引用
- 在getter中进行复杂计算
- 破坏对象的不变性
注意事项数据验证:在setter方法中进行必要的数据验证,确保对象状态的有效性不变性:对于不应该改变的字段,只提供getter方法,不提供setter方法防御性复制:当返回可变对象时,考虑返回副本而不是原对象的引用接口设计:设计简洁明了的公共接口,隐藏不必要的实现细节
章节总结
章节总结
- 封装是面向对象编程的核心概念,通过隐藏实现细节来保护对象状态
- Java提供四种访问修饰符:private、default、protected、public
- 良好的封装需要将字段设为私有,通过公共方法提供访问接口
- getter和setter方法是实现封装的重要手段
- 封装可以提高代码的安全性、可维护性和可重用性
- 在设计类时要遵循封装的最佳实践,避免暴露不必要的实现细节
导航链接 上一章:面向对象编程介绍 章节测试 下一章:Java继承
评论
0 条
还没有评论,先写一条吧。