1481 字
约 4 分钟
9
封装
无标签

第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继承

封装
https://clxhxhhr.top/posts/2736/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。