当前位置: 首页 > article >正文

[Java 基础]面向对象-封装

封装是构建健壮、可维护和安全软件的基础。

什么是封装?

想象一下你的手机。你不需要知道手机内部复杂的电路、芯片和各种组件是如何协同工作的,你只需要知道如何使用屏幕、按键或触摸操作来打电话、发短信或玩游戏。手机的内部细节被“包裹”起来,只对外提供简洁易用的接口。

在面向对象编程中,封装的概念与之类似。它指的是将数据(属性/成员变量)和操作这些数据的方法(行为/成员方法)捆绑在一起,形成一个独立的单元(也就是我们之前学习的类)。同时,封装还涉及到控制类中成员的可见性,隐藏内部实现细节,只对外暴露必要的接口。

封装的主要目标:

  • 数据隐藏 (Data Hiding): 保护对象内部的数据不被外部随意访问和修改,防止数据的意外损坏或不一致性。
  • 接口隔离 (Interface Segregation): 向外部提供清晰、简洁的接口来操作对象,隐藏复杂的内部实现细节,降低外部代码与内部实现的耦合度。
  • 提高代码的可维护性 (Maintainability): 当内部实现发生变化时,只要对外接口保持不变,就不会影响到使用该类的其他代码。这使得代码更容易修改和维护。
  • 提高代码的安全性 (Security): 通过控制访问权限,可以限制对敏感数据的操作,增强程序的安全性。
  • 代码重用 (Code Reusability): 封装良好的类可以作为独立的模块在不同的程序中重用。

如何在 Java 中实现封装?

在 Java 中,我们主要通过以下机制来实现封装:

  1. 使用访问修饰符 (Access Modifiers): Java 提供了不同的访问修饰符来控制类、成员变量和成员方法的可见性。常用的访问修饰符有:

public: 公有的,可以被任何类访问。

private: 私有的,只能在声明它的类内部访问。

protected: 受保护的,可以被声明它的类内部、同一个包中的其他类以及其子类访问。

默认(不写修饰符):包私有的,只能被声明它的类内部和同一个包中的其他类访问。

通常的做法是将类的成员变量声明为 private,以实现数据隐藏。

  1. 提供公共的访问方法 (Public Access Methods): 为了让外部代码能够操作私有的成员变量,我们需要提供公共的方法。常用的访问方法有:

Getter 方法 (获取器): 用于获取私有成员变量的值(通常以 get 开头,例如 getName())。

Setter 方法 (设置器): 用于修改私有成员变量的值(通常以 set 开头,例如 setAge(int newAge))。在 Setter 方法中,我们可以加入对输入值的合法性检查,从而保证数据的有效性。

代码示例:一个简单的 Person 类,让我们创建一个 Person 类来演示封装的概念:

public class Person {private String name; // 私有的姓名private int age;     // 私有的年龄// 公有的构造方法public Person(String name, int age) {this.name = name;this.age = age;}// 公有的 Getter 方法获取姓名public String getName() {return name;}// 公有的 Setter 方法设置姓名public void setName(String newName) {if (newName != null && !newName.isEmpty()) {this.name = newName;} else {System.out.println("姓名不能为空!");}}// 公有的 Getter 方法获取年龄public int getAge() {return age;}// 公有的 Setter 方法设置年龄public void setAge(int newAge) {if (newAge >= 0 && newAge <= 150) { // 添加年龄合法性检查this.age = newAge;} else {System.out.println("年龄不合法!");}}// 公有的行为方法public void introduce() {System.out.println("大家好,我叫 " + name + ",今年 " + age + " 岁。");}public static void main(String[] args) {Person person1 = new Person("Alice", 25);System.out.println("姓名:" + person1.getName()); // 通过 Getter 方法获取姓名System.out.println("年龄:" + person1.getAge());   // 通过 Getter 方法获取年龄person1.setName("Bob"); // 通过 Setter 方法修改姓名person1.setAge(30);    // 通过 Setter 方法修改年龄person1.introduce();// 尝试直接访问私有成员变量(会报错!)// System.out.println(person1.name);// person1.age = -10;}
}

封装是面向对象编程的核心概念之一。通过合理地使用访问修饰符和提供公共的访问方法,我们可以有效地隐藏类的内部实现细节,保护数据,提高代码的灵活性、可维护性和安全性。在设计类的时候,要养成将成员变量声明为 private 并提供公共的 Getter 和 Setter 方法的良好习惯。

相关文章:

[Java 基础]面向对象-封装

封装是构建健壮、可维护和安全软件的基础。 什么是封装&#xff1f; 想象一下你的手机。你不需要知道手机内部复杂的电路、芯片和各种组件是如何协同工作的&#xff0c;你只需要知道如何使用屏幕、按键或触摸操作来打电话、发短信或玩游戏。手机的内部细节被“包裹”起来&…...

2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家

前言 题解 2021 RoboCom 世界机器人开发者大赛-高职组&#xff08;复赛&#xff09;解题报告。 模拟题为主&#xff0c;包含进制转换等等。 最后一题&#xff0c;是对向量/自定义类型&#xff0c;重定义小于操作符。 7-1 人工智能打招呼 分值: 15分 考察点: 分支判定&…...

Python趣学篇:Pygame实现3D星空穿越动画

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》🪐 目录 一、项目概览与技术栈二、核心技术原理解析1. 透视投影:让3D世界"压扁"到2D屏幕2. Z轴深度:创造…...

基于Web的安全漏洞分析与修复平台设计与实现

基于Web的安全漏洞分析与修复平台设计与实现 摘要 随着信息化进程的加快&#xff0c;Web系统和企业IT架构愈发复杂&#xff0c;安全漏洞频发已成为影响系统安全运行的主要因素。为解决传统漏洞扫描工具定位不准确、修复建议不完善、响应周期长等问题&#xff0c;本文设计并实…...

34.1STM32下的can总线实现知识(区分linux)_csdn

看过我之前的文章就知道&#xff0c;正点原子下的linux中CAN总线并没有讲的很明白&#xff0c;都是系统自带的&#xff01; 这里我找到江科大学长的can总线的讲解视频&#xff01; CAN总线入门教程-全面细致 面包板教学 多机通信_哔哩哔哩_bilibili 在这里我也会一步一步讲解CA…...

相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之二十三:高通相机Camx 基于预览1帧的process_capture_request二级日志分析详解 这一篇我们开始讲: 相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_req…...

Linux 内核中 skb_dst_drop 的深入解析:路由缓存管理与版本实现差异

引言 在 Linux 内核网络子系统中,sk_buff(简称 SKB)是数据包在内核态流转的核心数据结构。为了高效处理网络数据包的路由选择,内核通过 dst_entry 结构体缓存路由信息,而 skb_dst_drop 函数则是管理这些路由缓存引用的关键工具。本文将从作用、实现原理、内核版本差异等多…...

考研系列—操作系统:冲刺笔记(4-5章)

目录 第四章 文件管理 1.真题总结文件管理方式 (1)目录文件的FCB就是“目录名-目录地址” (2)普通文件的FCB (3)区分索引文件、顺序文件、索引分配 (4)文件的物理结构 ①连续分配方式 ②链接分配 ③索引分配-使用索引表(一个文件对应一张索引表!!!) 计算考点:超级…...

功能管理:基于 ABP 的 Feature Management 实现动态开关

&#x1f680; 功能管理&#xff1a;基于 ABP 的 Feature Management 实现动态开关 &#x1f4da; 目录 &#x1f680; 功能管理&#xff1a;基于 ABP 的 Feature Management 实现动态开关&#x1f4da; 一、背景分析&#x1f9e9; 二、核心功能设计2.1 定义 Feature 常量与分组…...

2025年想冲网安方向,该考华为安全HCIE还是CISSP?

打算2025年往网络安全方向转&#xff0c;现在考证是不是来得及&#xff1f;考啥证&#xff1f; 说实话&#xff0c;网络安全这几年热得发烫&#xff0c;但热归热&#xff0c;入门门槛也不低&#xff0c;想进这个赛道&#xff0c;技术、项目经验、证书&#xff0c;缺一不可。 …...

ES6 深克隆与浅克隆详解:原理、实现与应用场景

ES6 深克隆与浅克隆详解&#xff1a;原理、实现与应用场景 一、克隆的本质与必要性 在 JavaScript 中&#xff0c;数据分为两大类型&#xff1a; 基本类型&#xff1a;Number、String、Boolean、null、undefined、Symbol、BigInt引用类型&#xff1a;Object、Array、Functio…...

Go Gin框架深度解析:高性能Web开发实践

Go Gin框架深度解析&#xff1a;高性能Web开发实践 Gin框架核心特性概览 Gin是用Go语言编写的高性能Web框架&#xff0c;以其​​闪电般的路由性能​​&#xff08;基于httprouter&#xff09;和​​极简的API设计​​著称&#xff1a; package mainimport "github.com…...

mybatis 参数绑定错误示范(1)

采用xml形式的mybatis 错误示例&#xff1a; server伪代码为&#xff1a; Map<String, Object> findMapNew MapUtil.<String, Object>builder().put("applyUnit", appUnit).put("planYear", year ! null ? year : -1).put("code&quo…...

每天掌握一个Linux命令 - rpm

Linux 命令工具 rpm 使用指南 Linux 命令工具 rpm 使用指南一、工具概述二、安装方式1. 系统预装2. 源码编译安装&#xff08;极少场景&#xff09; 三、核心功能四、基础用法1. 安装软件包2. 升级软件包3. 查询软件包信息4. 卸载软件包5. 验证文件完整性 五、进阶操作1. 批量操…...

常见的MySQL索引类型

在MySQL中&#xff0c;索引是用来提高数据库查询效率的一种数据结构。根据不同的使用场景和需求&#xff0c;MySQL提供了多种类型的索引&#xff0c;每种索引都有其特定的应用场景和优化效果。下面是一些常见的MySQL索引类型&#xff1a; 1. B-Tree索引&#xff1a; 这是最常…...

01串(二进制串)与集合之间存在天然的对应关系 ← bitset

【集合的二进制表示‌】 ● 01 串&#xff08;二进制串&#xff09;与集合之间存在天然的对应关系。对应机理为每个二进制位可以表示集合中一个元素的存在&#xff08;1&#xff09;或不存在&#xff08;0&#xff09;。例如&#xff0c;集合 {a, b, c} 的子集 {a, c} 可以表示…...

153页PPT麦肯锡咨询流程管理及企业五年发展布局构想与路径规划

麦肯锡咨询的流程管理以其高度结构化、数据驱动和结果导向的核心特点著称&#xff0c;旨在为客户提供清晰、可行且价值最大化的解决方案。其典型流程可概括为以下几个关键阶段&#xff1a;下载资料请查看文章中图片右下角信息 问题界定与结构化&#xff1a; 这是流程的基石。麦…...

[特殊字符] 革命性AI提示词优化平台正式开源!

AI时代最强大的Prompt工程师已经到来&#xff01; 你是否还在为写不出高质量提示词而头疼&#xff1f;是否羡慕那些能够驾驭AI、让ChatGPT、Claude乖乖听话的"提示词大师"&#xff1f;今天&#xff0c;我们为你带来一个颠覆性的解决方案——TokenAI Auto-Prompt&…...

我的概要设计模板(以图书管理系统为例)

一、总述 1.1 需求或目标 随着数字化阅读普及&#xff0c;传统图书馆管理方式效率低下、资源检索不便。为提升图书管理效率&#xff0c;方便读者借阅与查询&#xff0c;公司计划开发 “在线图书管理系统”&#xff0c;实现图书的电子化管理、快速检索、在线借阅等功能&#x…...

【使用】【经验】docker 清理未使用的镜像的命令

docker images prune在 Docker 中清理未使用的镜像&#xff08;包括悬空镜像和完全未被引用的镜像&#xff09;&#xff0c;可以使用以下命令&#xff1a; 1. ​删除所有悬空镜像​&#xff08;推荐常用&#xff09; docker image prune​悬空镜像 (dangling images)​​ 是指…...

DrissionPage爬虫包实战分享

一、爬虫 1.1 爬虫解释 爬虫简单的说就是模拟人的浏览器行为&#xff0c;简单的爬虫是request请求网页信息&#xff0c;然后对html数据进行解析得到自己需要的数据信息保存在本地。 1.2 爬虫的思路 # 1.发送请求 # 2.获取数据 # 3.解析数据 # 4.保存数据 1.3 爬虫工具 Dris…...

iptables实战案例

目录 一、实验拓扑 二、网络规划 三、实验要求 四、环境准备 1.firewall &#xff08;1&#xff09;配置防火墙各大网卡IP并禁用 firewall和selinux &#xff08;2&#xff09;打开firewall路由转发 2.PC1&#xff08;内网&#xff09; &#xff08;1&#xff09;配置防…...

机器学习与深度学习07-随机森林01

目录 前文回顾1.随机森林的定义2.随机森林中的过拟合3.随机森林VS单一决策树4.随机森林的随机性 前文回顾 上一篇文章链接&#xff1a;地址 1.随机森林的定义 随机森林&#xff08;Random Forest&#xff09;是一种集成学习算法&#xff0c;用于解决分类和回归问题。它基于决…...

回归分析-非线性回归及岭回归.docx

一.题目要求1.用SPSS软件练习建立多元线性回归方程,分析数据的多重共线性,利用后退法和逐步回归法选择变量,练习用岭回归方法处理该模型数据并作比较 2.用SPSS软件练习建立模型的非线性回归方程 二.数据分析(一)题目:课本7.6 1、数据 一家大型商业银行有多家分行,近年来…...

Google AI 模式下的SEO革命:生成式搜索优化(GEO)与未来营销策略

一、搜索范式转变&#xff1a;从链接引导到答案交付 Google自2023年起逐步推出AI搜索功能&#xff0c;经历了SGE&#xff08;Search Generative Experience&#xff09;和Gemini阶段&#xff0c;最终在2025年全面上线了「AI Mode」搜索模式。与此同时&#xff0c;也保留了一种过…...

docker创建postgreSql带多个init的sql

好的&#xff01;下面是一个完整的可运行项目结构&#xff0c;包含&#xff1a; ✅ docker-compose.yml&#xff1a;启动 PostgreSQL&#xff08;支持 pgvector&#xff09; ✅ init-db.sql&#xff1a;创建数据库 myapp ✅ init-schema.sql&#xff1a;在 myapp 中建表并初始…...

掌握 MotionLayout:交互动画开发

前言 在 Android 开发中&#xff0c;系统自带的属性动画&#xff08;如 ObjectAnimator 和 ValueAnimator&#xff09;虽然功能强大&#xff0c;但在复杂动画场景下&#xff0c;第三方动画库能提供更高效的开发体验和更丰富的效果。本文将深入解析 Lottie、MotionLayout、Andr…...

SpringBoot中缓存@Cacheable出错

SpringBoot中使用Cacheable: 错误代码&#xff1a; Cacheable(value "FrontAdvertiseVOList", keyGenerator "cacheKey") Override public List<FrontAdvertiseVO> getFrontAdvertiseVOList(Integer count) {return this.list(Wrappers.<Adve…...

iOS UIActivityViewController 组头处理

0x00 情形一 - (void)shareAction1 {// 当前 View 转成图片UIImage *image [self snapshotImage:self.view];NSArray *activityItems [image];UIActivityViewController *activityVC [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationAc…...

分布式电源接入配电网的自适应电流保护系统设计与实现

分布式电源接入配电网的自适应电流保护系统设计与实现 一、引言 随着可再生能源的快速发展,分布式电源(Distributed Generation, DG)大规模接入配电网,传统保护系统面临以下挑战: 潮流方向改变导致保护误动/拒动故障电流水平波动影响保护灵敏度多类型故障(单相/两相/三…...