”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 什么是封装以及如何使用它。

什么是封装以及如何使用它。

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

What is encapsulation and how to use it.

什么是封装?
Java 中的封装就是隐藏某些东西如何工作的细节,同时仍然允许其他人使用它。您将数据(如变量)和方法(如函数)分组到一个单元中,称为类。您不是让每个人都直接访问您的数据,而是提供方法(getter 和 setter)来控制数据的访问或更改方式。这样,您可以保护您的数据并保持代码整洁和有条理,除非您愿意,否则不会让任何人弄乱内部工作。

如何使用
要在 Java 中使用封装,您需要创建一个具有私有字段的类,并提供公共方法(如 getter 和 setter)来访问和修改这些字段。这确保了数据只能以受控方式更改。例如,如果您想创建一个 Person 类,其中名称和年龄是私有的,您可以使用 getter 来检索值并使用 setter 来更新它们。具体方法如下:

public class Person {
    // Private fields
    private String name;
    private int age;

    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter for name
    public String getName() {
        return name;
    }

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

    // Getter for age
    public int getAge() {
        return age;
    }

    // Setter for age
    public void setAge(int age) {
        if(age > 0) { // Simple validation
            this.age = age;
        } else {
            System.out.println("Age must be positive.");
        }
    }
}

// Using the Person class
public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 25);

        // Accessing fields using getters
        System.out.println(person.getName()); // Output: John
        System.out.println(person.getAge());  // Output: 25

        // Modifying fields using setters
        person.setName("Jane");
        person.setAge(30);

        System.out.println(person.getName()); // Output: Jane
        System.out.println(person.getAge());  // Output: 30
    }
}

让我们分解一下
让我们分解代码并逐步解释每个部分:

1. 带有私有字段的类定义
public class Person {
    // Private fields
    private String name;
    private int age;
}

解释:

这是 Person 类,我们在其中定义两个私有字段:name(字符串)和age(int)。通过将这些字段设置为私有,我们确保没有其他类可以直接访问或修改它们。这就是封装的核心思想——隐藏对象的内部状态。

2.构造函数
    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

解释:

构造函数在创建 Person 对象时对其进行初始化。它需要两个参数:姓名和年龄,并将这些值分配给私有字段。这确保了当创建新的 Person 对象时,它以有效数据开始。

3. Getter 和 Setter
    // Getter for name
    public String getName() {
        return name;
    }

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

解释:

构造函数在创建 Person 对象时对其进行初始化。它需要两个参数:姓名和年龄,并将这些值分配给私有字段。这确保了当创建新的 Person 对象时,它以有效数据开始。

4.年龄的Getter和Setter(带验证)
    // Getter for age
    public int getAge() {
        return age;
    }

    // Setter for age
    public void setAge(int age) {
        if (age > 0) { // Simple validation
            this.age = age;
        } else {
            System.out.println("Age must be positive.");
        }
    }

解释:

getter getAge() 的工作方式与 name 的 getAge() 的工作方式相同,允许访问年龄字段。
setAge() 方法不仅允许修改年龄字段,还添加了验证检查。 if 条件确保仅当年龄为正数时才设置年龄。如果提供了无效的年龄(例如负数),设置器将阻止更新并打印一条消息。这是封装如何让您控制可以设置的数据类型的示例。

5. 使用 Person 类
// Using the Person class
public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 25);

        // Accessing fields using getters
        System.out.println(person.getName()); // Output: John
        System.out.println(person.getAge());  // Output: 25

        // Modifying fields using setters
        person.setName("Jane");
        person.setAge(30);

        System.out.println(person.getName()); // Output: Jane
        System.out.println(person.getAge());  // Output: 30
    }
}

解释:

在本节中,我们使用构造函数创建一个Person对象(person)。构造函数将初始名称设置为“John”,年龄设置为 25。

然后,我们使用 getter(getName() 和 getAge())来打印 name 和age 的值。之后,我们使用 setter(setName() 和 setAge())来更新值。最后,再次使用 getter 打印更新后的值。

封装实践要点:

  • 数据保护:

    私有字段不能从类外部直接访问或修改。

  • 受控访问:

    获取器和设置器提供了访问和修改私有字段的受控方式。

  • 验证:

    年龄的设置器演示了如何强制执行规则(例如,年龄必须为正)以保护数据免受无效输入的影响。

版本声明 本文转载于:https://dev.to/ife_oluwa/what-is-encapsulation-and-how-to-use-it-207d?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 使用 JavaScript 进行网页抓取和代理设置的初学者指南
    使用 JavaScript 进行网页抓取和代理设置的初学者指南
    使用JavaScript代码模拟用户操作,获取所需信息。包括模拟用户打开网页、点击链接、输入关键字等操作,并从网页中提取所需的信息。 Javascript网页抓取的核心原理 使用JavaScript代码模拟用户操作来获取所需信息。包括模拟用户打开网页、点击链接、输入关键字等操作,并从...
    编程 发布于2024-11-09
  • 在 Android 上运行 Llama:使用 Ollama 的分步指南
    在 Android 上运行 Llama:使用 Ollama 的分步指南
    Llama 3.2 最近在 Meta 开发者大会上推出,展示了令人印象深刻的多模式功能以及针对使用高通和联发科技硬件的移动设备进行优化的版本。这一突破使开发人员能够在移动设备上运行 Llama 3.2 等强大的 AI 模型,为更高效、私密和响应迅速的 AI 应用程序铺平道路。 Meta 发布了 Ll...
    编程 发布于2024-11-09
  • 如何在 Python 中格式化字符串以将它们对齐直列?
    如何在 Python 中格式化字符串以将它们对齐直列?
    以固定宽度打印字符串打印字符串时,将它们对齐成直列可以增强可读性。在 Python 中使用 format 或 f-string 提供了实现此目的的便捷方法。使用 str.format()str.format() 提供了一种简单的填充方法字符串。其语法包括占位符 {},后跟格式化表达式。对于左对齐,请...
    编程 发布于2024-11-09
  • 为什么微服务比单体架构重要
    为什么微服务比单体架构重要
    在当今快节奏的技术环境中,企业需要可扩展且灵活的解决方案来快速适应不断变化的需求。与传统的整体方法相比,这就是微服务架构的亮点。 1.什么是单体架构? 单体架构是一个单一的、统一的系统,其中所有组件都是互连和相互依赖的。这意味着对系统的任何更改或更新都需要重新构建和重新部署整个应用程...
    编程 发布于2024-11-09
  • 如何在 PHP 中访问对象属性:了解语法和错误解决方案
    如何在 PHP 中访问对象属性:了解语法和错误解决方案
    理解 PHP 对象属性访问在 PHP 中,访问对象属性对于处理复杂的数据结构至关重要。属性保存与对象关联的信息,使我们能够管理和操作该数据。访问对象属性有两种常用语法:1。 $property1此语法直接通过名称访问特定属性。它用于分配或检索各个属性的值。但是,这种方法要求您提前知道确切的属性名称。...
    编程 发布于2024-11-09
  • PDO如何防止SQL注入并替换转义单引号?
    PDO如何防止SQL注入并替换转义单引号?
    PDO防止SQL注入的方法如果你已经从mysql库过渡到PDO,你可能想知道如何替换real_escape_string用于转义发往数据库的字符串中的单引号的函数。虽然向每个字符串添加斜杠可能看起来很麻烦,但 PDO 提供了一种更有效的替代方案。PDO 准备的强大功能为了防止 SQL 注入,PDO ...
    编程 发布于2024-11-09
  • 通过“项目:使用互斥体同步多线程打印”课程释放您的编码潜力
    通过“项目:使用互斥体同步多线程打印”课程释放您的编码潜力
    您准备好深入多线程编程的世界并学习如何使用互斥体来同步字符串的打印了吗? LabEx 提供的项目:使用互斥体同步多线程打印课程就是您的最佳选择。 在这个基于项目的综合课程中,您将踏上了解互斥体在协调多线程执行方面的重要性的旅程。您将首先修改现有的“混沌打字机”程序,确保字符串以正确的顺序打印,而不会...
    编程 发布于2024-11-09
  • 为什么我在 MySQL 中收到“\'create_date\'时间戳字段的默认值无效”错误?
    为什么我在 MySQL 中收到“\'create_date\'时间戳字段的默认值无效”错误?
    “create_date”时间戳字段的默认值无效创建带有时间戳列的表并指定默认值“0000-”时00-00 00:00:00',可能会出现错误,指示“'create_date'的默认值无效”。这个错误是由 MySQL 的 SQL 模式 - NO_ZERO_DATE 引起的。根...
    编程 发布于2024-11-09
  • 尽管出现“页面已移动”错误,如何使用 cURL 检索页面内容?
    尽管出现“页面已移动”错误,如何使用 cURL 检索页面内容?
    使用 cURL 检索页面内容在此上下文中,您试图使用 cURL 抓取 Google 搜索结果页面的内容。尽管尝试设置用户代理和各种选项,但您仍无法成功检索页面内容。重定向或“页面移动”错误继续困扰着您。据信该问题可能源于查询字符串中特殊字符的编码。为了缓解这种情况,需要更改 PHP 代码。方法如下:...
    编程 发布于2024-11-09
  • 如何使用 JPA 和 Hibernate 以 UTC 格式存储日期/时间?
    如何使用 JPA 和 Hibernate 以 UTC 格式存储日期/时间?
    使用 JPA 和 Hibernate 在 UTC 时区存储日期/时间在 JPA/ 中处理日期和时间时担心时区差异休眠应用程序?本文探讨了如何在 UTC (GMT) 时区有效存储和检索时态数据,确保跨不同时区进行一致且准确的处理。考虑下面带注释的 JPA 实体:public class Event {...
    编程 发布于2024-11-09
  • 如何使用 CSS 创建动态扩展的文本输入字段?
    如何使用 CSS 创建动态扩展的文本输入字段?
    通过 CSS 增强文本输入响应能力制作 Web 表单时,控制文本输入字段的大小至关重要。 CSS 提供了一种简单的方法来定义其初始尺寸。但是,如果您希望输入随着用户键入而动态扩展并达到最大宽度,该怎么办?本文深入研究了仅 CSS 和基于 HTML 的技术来实现此行为。CSS 和内容可编辑利用 CSS...
    编程 发布于2024-11-09
  • 关于 Javascript Promise 的有趣事实
    关于 Javascript Promise 的有趣事实
    Promise 始终是异步的 Promise 的回调总是在同步代码之后执行 const promise = Promise.resolve(); promise.then(() => console.log('async')); console.log('sync'); ...
    编程 发布于2024-11-09
  • LightFlow:Go 的任务编排框架
    LightFlow:Go 的任务编排框架
    我开发了 LightFlow,一个任务编排框架,旨在简化 Go 中复杂工作流程的管理。它专注于执行时序并减少对外部配置文件的需求。 主要特点: 独立上下文:每个步骤都通过独立上下文链接,仅允许访问相关数据。 可合并流程:您可以灵活组合任务流程,以便在不同流程中重复使用。 检查点恢复:...
    编程 发布于2024-11-09
  • 使用 HTML、CSS 和 JavaScript 构建简单的链接检查器工具
    使用 HTML、CSS 和 JavaScript 构建简单的链接检查器工具
    使用 HTML、CSS 和 JavaScript 构建简单的链接检查器工具 作为...
    编程 发布于2024-11-09
  • ## 为什么 GetSystemTimeAdjustment 并不总是反映 Windows 7 上的真实时间调整?
    ## 为什么 GetSystemTimeAdjustment 并不总是反映 Windows 7 上的真实时间调整?
    Windows 7 计时函数:了解 GetSystemTimeAdjustment正如您所观察到的,在 Windows 7 上使用 GetSystemTimeAdjustment 函数的结果可能会令人费解。为了更好地理解,让我们解决您的问题:问题1:假设的正确性您的假设总体上是正确的。如果系统时间定...
    编程 发布于2024-11-09

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

Copyright© 2022 湘ICP备2022001581号-3