”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 中的封装与抽象:终极指南

Java 中的封装与抽象:终极指南

发布于2024-11-08
浏览:635

Encapsulation vs. Abstraction in Java: The Ultimate Guide

学习 Java 或任何面向对象编程 (OOP) 语言时,两个基本概念很突出:封装抽象。这些概念是 OOP 的关键支柱,可提高代码的可重用性、安全性和可维护性。尽管它们经常一起使用,但它们具有不同的目的。

在这篇文章中,我们将深入探讨封装和抽象之间的差异,并通过清晰的定义、示例和代码片段来帮助您了解它们在 Java 编程中的作用。让我们来分解一下吧!

什么是封装?

封装是将数据(变量)和对数据进行操作的方法捆绑到单个单元(通常是类)中的过程。它向外界隐藏对象的内部状态,只允许通过公共方法进行受控访问。

封装的主要特点:

  1. 数据隐藏:内部对象数据对其他类隐藏。
  2. 访问控制:只有允许的(公共)方法才能操作隐藏数据。
  3. 提高安全性:防止外部代码直接修改内部数据。
  4. 维护方便:如果内部实现发生变化,只需要更新方法,不需要更新外部类。

Java封装的例子:

// Encapsulation in action

public class Employee {
    // Private variables (data hiding)
    private String name;
    private int age;

    // Getter and setter methods (controlled access)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// Using the encapsulated class
public class Main {
    public static void main(String[] args) {
        Employee emp = new Employee();
        emp.setName("John Doe");
        emp.setAge(30);

        System.out.println("Employee Name: "   emp.getName());
        System.out.println("Employee Age: "   emp.getAge());
    }
}

在此示例中,Employee 类通过将其声明为私有来隐藏其字段(姓名和年龄)。像 Main 这样的外部类只能通过 getter 和 setter 方法访问这些字段,这些方法控制和验证输入/输出。


什么是抽象?

抽象是指隐藏对象复杂的实现细节并仅暴露基本特征的概念。这简化了与对象的交互并使代码更加用户友好。

抽象的主要特征:

  1. 隐藏复杂性:用户只看到自己需要的,底层代码被隐藏。
  2. 关注“内容”而不是“如何”:仅向用户提供必要的详细信息,同时隐藏实现。
  3. 帮助管理复杂性:通过提供简化的接口,有助于处理复杂的系统。
  4. 通过接口和抽象类强制执行:这些构造提供了蓝图而不暴露实现。

Java 中的抽象示例:

// Abstract class showcasing abstraction
abstract class Animal {
    // Abstract method (no implementation)
    public abstract void sound();

    // Concrete method
    public void sleep() {
        System.out.println("Sleeping...");
    }
}

// Subclass providing implementation for abstract method
class Dog extends Animal {
    public void sound() {
        System.out.println("Barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.sound();  // Calls the implementation of the Dog class
        dog.sleep();  // Calls the common method in the Animal class
    }
}

这里,抽象类Animal包含一个抽象方法sound(),该方法必须由其子类实现。 Dog 类提供了自己的 sound() 实现。这样,用户不需要担心 sound() 方法内部如何工作——他们只需调用它即可。


封装与抽象:主要区别

现在我们已经了解了定义和示例,让我们重点介绍 Java 中封装和抽象之间的主要区别:

特征 封装 抽象
目的 数据隐藏和保护内部状态 通过隐藏复杂细节来简化代码
重点 使用 getter/setter 控制对数据的访问 提供基本功能并隐藏实现
执行 使用带有私有字段的类实现 使用抽象类和接口实现
OOP 中的角色 提高安全性并保持对数据的控制 简化与复杂系统的交互
例子 私有变量和公共方法 抽象方法和接口

Java 的实际用例

何时使用封装:

  • 当您需要保护数据时:例如,在银行系统中不应直接修改账户余额。
  • 当您想要控制数据的访问方式时:确保只有允许的方法才能修改或检索数据,从而添加一层安全性。

何时使用抽象:

  • 在大型系统上工作时:在各种类和模块交互的大型项目中,抽象可以通过提供简化的接口来帮助管理复杂性。
  • 开发API时:仅向用户公开必要的细节,同时隐藏实际的实现。

封装和抽象相结合的好处

虽然封装和抽象服务于不同的目的,但它们一起工作以在 Java 中构建健壮、安全和可维护的代码。

  1. 安全性和灵活性:通过将两者结合起来,您可以确保数据受到保护(封装),同时仍然允许用户以简单的方式与其交互(抽象)。
  2. 代码可维护性:抽象隐藏了复杂性,使系统更易于管理,而封装提供了对数据的受控访问。
  3. 可重用性:这两个概念都促进代码重用——通过隔离数据进行封装,通过允许抽象方法的不同实现进行抽象。

结论:掌握 Java 中的封装和抽象

封装和抽象是面向对象编程中两个强大的概念,每个 Java 开发人员都应该掌握。虽然封装通过控制数据访问来帮助保护对象的内部状态,但抽象隐藏了系统的复杂性并仅提供必要的细节。

通过理解和应用两者,您可以构建经得起时间考验的安全、可维护和可扩展的应用程序。


本指南是否帮助您阐明 Java 中的封装和抽象?在下面的评论中分享您的想法或问题!


标签:

  • #Java
  • #OOP
  • #封装
  • #抽象
  • #Java编程

版本声明 本文转载于:https://dev.to/abhinowww/encapsulation-vs-abstraction-in-java-the-ultimate-guide-4ccf?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • JavaScript 能否为不可预测的属性实现动态 Getter 和 Setter?
    JavaScript 能否为不可预测的属性实现动态 Getter 和 Setter?
    JavaScript 可以实现动态 Getters/Setters 吗?动态 getters 和 setters 允许 JavaScript 对象处理超出预定义属性的属性访问和修改。虽然早期的 JavaScript 技术对已知属性使用特定的 getter 和 setter,但本文探讨了为任何未定义的...
    编程 发布于2024-11-08
  • 我的第一个使用 Python 构建的开源项目,通过 CLI 快速检查数据库
    我的第一个使用 Python 构建的开源项目,通过 CLI 快速检查数据库
    我的问题是: 在处理其他项目时,我发现自己总是必须连接并使用 SELECT * 来查看虚拟条目或新用户。我更喜欢使用 CLI 来监视我的数据库条目,特别是因为我正在测试并只是将虚拟用户添加为项目中的第一个普通用户。因此,总是需要连接到 postgres、mysql 并从 CLI 进行 select ...
    编程 发布于2024-11-08
  • PHP,永不倒下的大象!
    PHP,永不倒下的大象!
    照片由 Ben Griffiths 在 Unsplash 上拍摄 PHP是一种广受好评的语言,同时也受到其他人的批评,有人说它正在消亡,但真的是这样吗,值得花时间学习PHP吗? PHP PHP 是 Rasmus Lerdorf 在 90 年代开发的一种编程语言,最初它被开发为一种服务...
    编程 发布于2024-11-08
  • 如何从 Android 应用程序安全访问远程 MySQL 数据库?
    如何从 Android 应用程序安全访问远程 MySQL 数据库?
    使用 JDBC 在 Android 中访问远程 MySQL 数据库:综合分析使用 JDBC API 从 Android 应用程序远程连接到 MySQL 数据库是一种常见的操作移动开发者之间的问题。虽然建立直接连接在技术上是可行的,但它带来了重大的安全和性能问题。安全影响允许 Android 应用程序...
    编程 发布于2024-11-08
  • 使用 CSS 创建自定义鼠标光标
    使用 CSS 创建自定义鼠标光标
    Written by Samson Omojola✏️ Editor’s note: This article was last updated by Njong Emy on 5 August 2024 to update content and code blocks, as well as t...
    编程 发布于2024-11-08
  • 如何修复 Chrome 扩展程序中孤立内容脚本导致的“扩展程序上下文无效”错误?
    如何修复 Chrome 扩展程序中孤立内容脚本导致的“扩展程序上下文无效”错误?
    如何在 Chrome 扩展程序更新后删除孤立脚本问题无意中重新加载 Chrome 扩展程序,尤其是处于开发者模式的扩展程序,可能会创建孤立内容脚本。这些脚本仍然在后台运行,但与扩展的其余部分失去了通信,从而导致诸如“扩展上下文无效”和“未检查的运行时.lastError”之类的错误。解决方案孤立的内...
    编程 发布于2024-11-08
  • 为什么需要设置$GOPATH以及如何有效使用它?
    为什么需要设置$GOPATH以及如何有效使用它?
    在 $GOPATH 的迷宫中导航作为一个初露头角的 Go 开发者,在错综复杂的 $GOPATH 中导航可能会令人畏惧。为了阐明其目的和用法,让我们深入研究有关此环境变量的一些常见问题。为什么在项目根目录设置 $GOPATH?传统上, $GOPATH 对于设置安装 Go 包的工作区至关重要。默认情况下...
    编程 发布于2024-11-08
  • 如何构建数据输入系统(快速简单指南)
    如何构建数据输入系统(快速简单指南)
    三步构建数据输入系统 在本指南中,我们详细介绍了使用 Five 的快速应用程序开发环境构建和部署数据输入系统所需的步骤。 什么是数据输入系统? 数据输入系统是一个旨在捕获、存储、管理和分析数据的平台。这些系统有助于收集用于决策、研究、分析和报告的重要信息。数据输入系统范围从基本的在线表格到与数据库和...
    编程 发布于2024-11-08
  • 使用内联 SVG 时如何确保剪辑路径的响应式对齐?
    使用内联 SVG 时如何确保剪辑路径的响应式对齐?
    具有内联 SVG 的响应式剪辑路径将剪辑路径应用于具有背景的元素时,通常会嵌入 SVG 内联。但是,您可能会遇到响应能力或对齐问题,如下例所示:<header id="block-header"> <svg width="100%" he...
    编程 发布于2024-11-08
  • 使用 PHP 安全地传送电子邮件:使用 SMTP 发送无垃圾邮件的指南
    使用 PHP 安全地传送电子邮件:使用 SMTP 发送无垃圾邮件的指南
    这是如何使用 PHP SMTP 发送电子邮件而不进入垃圾邮件文件夹的分步示例。 我们将使用 PHPMailer 库,它简化了通过 SMTP 发送电子邮件的过程,并有助于提高送达率。按照以下步骤,您将了解如何正确配置 SMTP 以避免电子邮件进入垃圾邮件文件夹。 第1步:安装PHPMa...
    编程 发布于2024-11-08
  • 如何使用 Python 的“locale”模块来格式化货币值?
    如何使用 Python 的“locale”模块来格式化货币值?
    Python 中的货币格式:综合指南将数字格式化为货币是编程中的一项常见任务,尤其是在处理财务数据时。在 Python 中,locale 模块提供了方便的函数来格式化货币值。如何使用 Python 的 locale 模块格式化货币值导入 locale模块:import locale设置区域设置:为了...
    编程 发布于2024-11-08
  • 您可能不知道的关于类型转换的有趣事实
    您可能不知道的关于类型转换的有趣事实
    介绍 类型转换不仅仅是技术上的需要;它有着丰富的历史和许多程序员可能不知道的迷人的细微差别。了解这些可以为编程和软件开发提供更深入的见解。 类型转换的历史视角 多年来,类型转换的概念已经发生了显着的演变。 编程语言中类型转换的演变: 在编程的早期,类型转换是一个手动...
    编程 发布于2024-11-08
  • 将数据提取到 CSV 文件时,为什么我的 PDO 准备语句返回双结果?
    将数据提取到 CSV 文件时,为什么我的 PDO 准备语句返回双结果?
    PDO 准备语句获取双结果用户遇到了一个问题,即在将数据输出到CSV 文件。相关代码利用 $result_get_rows->fetch() 函数从数据库中检索行。理解 Fetch() 方法The fetch() PDOStatement 对象的方法用于从结果集中检索行。默认情况下,它以索引数组(按...
    编程 发布于2024-11-08
  • 鸭子类型遇到类型提示:在 Python 中使用协议
    鸭子类型遇到类型提示:在 Python 中使用协议
    Python 的动态特性和对鸭子类型的支持长期以来因其灵活性而受到称赞。然而,随着代码库变得越来越大、越来越复杂,静态类型检查的好处变得越来越明显。但是我们如何协调鸭子类型的灵活性和静态类型检查的安全性呢?进入Python的Protocol类。 在本教程中,您将学习: 什么是鸭子类型以及 Pytho...
    编程 发布于2024-11-08
  • 如何在 PHP 中将时间戳向下舍入到最近的刻钟?
    如何在 PHP 中将时间戳向下舍入到最近的刻钟?
    将时间向下舍入到最近的刻钟许多应用程序需要操作时间戳并根据时间执行计算。一个常见的要求是将时间四舍五入到最接近的一刻钟。 PHP 提供了几个可以帮助完成此任务的函数。这是一个 PHP 脚本,演示如何将 MySQL 日期时间字段四舍五入到最近的刻钟:<?php // Get the curren...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3