Java 封装怎么理解

简介: 封装是Java中的一种重要机制,它将对象的状态(数据)和行为(方法)打包在一起并控制外部访问权限,以保护数据不被随意修改。封装的主要目的包括数据保护、接口设计和增强模块性。通过使用`private`、`protected`及`public`等访问控制修饰符,结合getter和setter方法,可以有效隐藏对象内部实现细节。下面是一个简单的`BankAccount`类示例,展示了如何通过封装保护类的内部状态,确保数据安全和一致性,简化类的使用。理解封装有助于编写高质量代码和设计优秀程序架构。

理解 Java 的封装可以通过以下几个方面:

1. 封装的定义

封装是将对象的状态(数据)和行为(方法)打包在一起,同时控制外部对这些成员的访问权。通过对数据的封装,可以隐藏对象的内部实现,保护数据不被随意修改。

2. 封装的目的

  • 数据保护:封装提供了一种机制,通过它可以限制对对象的内部状态的访问,从而防止外部代码无意中或恶意地改变对象状态。
  • 接口设计:封装使得类的使用者可以通过公共方法来与对象交互,而不需要了解其内部实现细节。这样可以降低系统复杂性,提高代码的可读性和可维护性。
  • 增强模块性:逻辑上相关的属性和方法被组织在一起,形成类,从而使得代码有条理,更易于管理。

3. 关键概念

  • 访问控制修饰符

    • private:仅在类内部可见,外部无法访问该成员。
    • protected:同包内类和子类可见。
    • public:所有类均可访问。
    • 默认(无修饰符):仅限于同一包内可见。
  • getter 和 setter 方法

    • 通常,私有属性会通过公共的 getter 和 setter 方法来访问和修改。这提供了一种访问数据的安全方式,允许在修改数据前执行额外的逻辑(如验证)。

4. 示例代码

以下是封装的一个简单示例,展示如何保护类的内部状态:

// 定义一个 BankAccount 类
public class BankAccount {
   
    // 私有属性
    private String accountNumber;
    private double balance;

    // 构造器
    public BankAccount(String accountNumber, double initialBalance) {
   
        this.accountNumber = accountNumber;
        this.balance = initialBalance >= 0 ? initialBalance : 0;
    }

    // 公共的 getter 方法
    public String getAccountNumber() {
   
        return accountNumber;
    }

    // 公共的 getter 方法
    public double getBalance() {
   
        return balance;
    }

    // 公共的方法,允许查询余额
    public void deposit(double amount) {
   
        if (amount > 0) {
   
            balance += amount;
        }
    }

    // 公共的方法,允许取款,确保余额充足
    public void withdraw(double amount) {
   
        if (amount > 0 && amount <= balance) {
   
            balance -= amount;
        }
    }
}

// 主类
public class Main {
   
    public static void main(String[] args) {
   
        BankAccount account = new BankAccount("12345", 1000);

        // 查询账户信息
        System.out.println("Account Number: " + account.getAccountNumber());
        System.out.println("Initial Balance: " + account.getBalance());

        // 存款
        account.deposit(500);
        System.out.println("Balance after deposit: " + account.getBalance());

        // 取款
        account.withdraw(300);
        System.out.println("Balance after withdrawal: " + account.getBalance());

        // 尝试非法取款
        account.withdraw(2000); // 不会影响余额
        System.out.println("Balance after invalid withdrawal: " + account.getBalance());
    }
}

5. 小结

在这个简单的 BankAccount 示例中:

  • accountNumberbalance 属性是私有的,外部无法直接访问。
  • 提供了公共的 getAccountNumber()getBalance() 方法用于获取账户信息。
  • deposit()withdraw() 方法负责修改余额,并通过条件检查避免非法操作。

通过这种方式,封装确保了对象的状态的安全性和一致性,使得 BankAccount 类的使用更加安全和简单。这就是封装在 Java 中的意义和作用。理解封装不仅有助于写出更好的代码,也有助于设计出更好的程序架构。

相关文章
|
9天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
5天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2491 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
5天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1510 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19280 30
|
7天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
464 11
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18829 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17521 13
Apache Paimon V0.9最新进展
|
1月前
|
存储 人工智能 前端开发
AI 网关零代码解决 AI 幻觉问题
本文主要介绍了 AI Agent 的背景,概念,探讨了 AI Agent 网关插件的使用方法,效果以及实现原理。
18699 16
|
4天前
|
SQL 监控 druid
Druid连接池学习
Druid学习笔记,使用Druid进行密码加密。参考文档:https://github.com/alibaba/druid
204 82
|
7天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
422 46
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界