day13_面向对象的三大特征之一(封装)

news2025/2/25 1:08:36

封装概述

为什么需要封装?

  • 现实生活中,每一个个体与个体之间是有边界的,每一个团体与团体之间是有边界的,而同一个个体、团体内部的信息是互通的,只是对外有所隐瞒。例如:我们使用的电脑,内部有CPU、硬盘、键盘、鼠标等等,每一个部件通过某种连接方式一起工作,但是各个部件之间又是独立的。

面向对象编程语言是对客观世界的模拟,客观世界里每一个事物的内部信息都是隐藏在对象内部的,外界无法直接操作和修改,只能通过指定的方式进行访问和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”,而“高内聚,低耦合”的体现之一:

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;

  • 低耦合:仅对外暴露少量的方法用于使用

隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

如何实现封装呢?

通俗的讲,封装就是把该隐藏的隐藏起来,该暴露的暴露出来。那么暴露的程度如何控制呢?就是依赖访问控制修饰符,也称为权限修饰符来控制。访问控制修饰符来控制相应的可见边界,边界有如下:

  • 子类
  • 模块:Java9之后引入

在Java中 权限修饰符 如下所示:

外部类,我们只能使用public和缺省来修饰

成员变量、成员方法、构造器、成员内部类,我们可以使用任意的其中一种修饰符

注意事项:

protected修饰非静态成员,跨包时,只能在子类的非静态成员中访问,在静态成员中无论是否创建对象都不能访问。

成员变量(属性)封装

好处:

  • 隐藏类的实现细节
  • 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
  • 便于修改,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String从char[]转为byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。

成员变量也称为属性(property),我们对成员变量的封装也称之为对属性的封装。具体步骤如下:

1:使用 private 修饰成员变量,格式如下:

代码示例


public class Student {
    //使用 private 修饰成员变量
    private String name;
}

 2:提供 getXxx方法 / setXxx 方法,可以访问成员变量代码如下:

public class Student {
    //使用 private 修饰成员变量
    private String name;

    //获取成员变量值的getXxx方法
    public String getName() {
        return name;
    }

    //设置成员变量值的setXxx方法
    public void setName(String name) {
        this.name = name;
    }

}

我们观察上面的代码发现,this出现在其中,但它到底是什么意思了?this代码当前对象,哪个对象调用这个方法,this就代表哪个对象,在这里它主要用来区分同名的成员变量和局部变量。

测试代码

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        //设置属性的值
        student.setName("张三");
        //获取属性的值
        System.out.println("名字是: " + student.getName());
    }
}

如何解决局部变量与成员变量同名问题

  • 当局部变量与类变量(静态成员变量)同名时,在类变量前面加“类名.";
  • 当局部变量与实例变量(非静态成员变量)同名时,在实例变量前面加“this.”

当然this还有其他的作用,这个我们以后在说..

总结

把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。封装的思想体现在Java的各个方面,例如:

  • 属性私有化是对属性的封装
  • 方法是对独立功能的封装
  • 包是对类的封装
  • ....

我们可以实际需要来使用Java中的封装性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java框架篇(来自硅谷的面试题)

目录 一 简单的谈一下SpringMVC的工作流程? 二 说出Spring或者SpringMVC中常用的5个注解,并解释含义 三 简述SpringMVC中如何返回JSON数据(北京) 四 谈谈你对Spring的理解 五 Spring中常用的设计模式 六 Spring循环…

IDA安装使用

最近学逆向,先备一套工具吧,IDA名声在外,首当其冲!! 内容主要整理自别的博客, Linux下安装IDA 链接: https://pan.baidu.com/s/1p9elz1a34872LsY1WLJmlA?pwdis2u 这个ida版本为32bit Linux系统准备的&…

Linux生产者消费者与信号量

目录 一.生产者消费者概念 二.模拟实现基于阻塞队列的生产消费模型 2.1概念 2.2构造阻塞队列 三.信号量 3.1原理 3.2信号量函数 3.3信号量模拟互斥功能 一.生产者消费者概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。 生产者和消费者彼此之间…

【C语言】十六进制转换为十进制

目录 题目描述 补充知识: 算法分析 优化算法 写在最后 题目描述 输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符(\0)结束转换。 注意: 输入的字符…

【Java多线程】初识线程及三种创建方式

➤ Java多线程编程【一文全解】 文章目录线程简介进程的创建> 继承 Thread 类> 实现 Runnable 接口> 实现 Callable 接口线程简介 普通的程序中,方法的调用是执行到方法的时候,程序跳转到方法体中进行,是按照顺序进行的,…

说说未来趋势 「元宇宙」是什么?

最近「元宇宙」概念大火,连星爷等各行各业的各路大佬都可以传出消息布局进入这一个领域,那么这是不是意味这IT信息化时代的下一个风口,就是元宇宙呢?按小郭说呀,这目前来看,这个趋势是必然的,就…

Spirng 痛苦源码学习(一)——总起spring(一)

文章目录前言一、总览Spring的bean1)bean的过程【先了解具体的生命周期后面弄】2)hello spring 简单bean操作二、总览AOP- 1、test coding- 2、- debug- 3、- 总结debug三、总览事务- 1、- test coding- 2、 debugging- 3、 事务失效- 4、事务总结前言 …

cpu设计和实现(流水线暂停)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,数字电路里面流水线的引入,主要是为了提高数据的处理效率。那么,鉴于此,为什么又要对…

ssm宠物商城管理系统源码

在 Internet飞速开展的今天,互联网成为人们快速获取、发布和传 递信息的重要渠道,它在人们学习、工作、生活等各个方面发挥着重要的作用。 因此建立在 Internet应用上的地位显而易见,它已成为政府、企事业单位信息化 建立中的重要组成局部&am…

[附源码]SSM计算机毕业设计网上书店管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【kafka】十五、kafka消费者API

kafka消费者API Consumer消费数据时的可靠性是很容易保证的,因为数据在kafka中是持久化的,故不用担心数据丢失的问题。 由于consumer在消费过程中可能会出现断电宕机的等故障,consumer恢复后,需要从故障前的位置继续消费&#xf…

visual studio 2019 + Qt 开发,使用visual leak detector检测内存泄漏

选择了在vs2019上开发Qt, 遇到了内存泄露问题。还好vs上有方便的visual leak detector(vld)检测工具。 虽然官网上只支持到vs2015, 但vs2019上也能用。 具体参考这位博主的文章:https://blog.csdn.net/qq_22108657/article/details/1208843…

Redis数据库安装(Windows)

目录 一、下载Windows安装包 二、启动Redis 1.在终端中启动 2.使用start.bat文件启动 3.添加服务启动 三、安装Redis可视化管理工具 1.安装Redis图形客户端 2.连接数据库 一、下载Windows安装包 下载地址:Releases tporadowski/redis GitHub 选择下载相…

单链表的递归详解 (leetcode习题+ C++实现)

文章目录合并两个有序链表翻转链表链表中移除节点合并两个有序链表 传送门: https://leetcode.cn/problems/merge-two-sorted-lists/description/ 题目要求; 给你两个有序的链表,将这两个链表按照从小到大的关系,合并两个链表为…

Mybatis快速入门

Mybatis安装与配置 Mybatis概述 Mybatis本质上是一个别人写好的框架,用于简化 JDBC 开发,通过Mybatis框架,可以极大的降低JDBC的开发难度。 官方文档:https://mybatis.org/mybatis-3/zh/index.html Mybatis快速入门 需求&…

MySQL进阶实战10,MySQL全文索引

一、全文索引 全文索引的目的是 通过关键字的匹配进行查询过滤,基于相似度的查询,而不是精确查询。 全文索引利用分词技术分析出文字中某关键字的频率和重要性,并按照一定的算法智能的筛选出我们想要的结果。 全文索引一般用于字符串中某关…

tomcat服务器安装及配置教程(保姆级教程)

Tomcat安装教程 (以tomcat-9.0.62为例:) 1.下载安装包 可以从官网下载安装包: (1)从官网下载 输入网址进入官网 选择版本10,版本9,或者版本8,都可以,这里…

掘金热榜首推!阿里内部都在用的Java后端面试笔记,囊括99%的主流技术

纵观今年的技术招聘市场, Java依旧是当仁不让的霸主 !即便遭受 Go等新兴语言不断冲击,依旧岿然不动。究其原因: Java有着极其成熟的生态,这个不用我多说;Java在 运维、可观测性、可监 控性方面都有着非常优…

Spring Boot JPA 本机查询示例

在本教程中,您将了解如何在 Spring 引导中使用 Spring Data JPA 本机查询示例(带参数)。我将向您展示: 将 Spring JPA 本机查询与Query注释一起使用的方法如何在 Spring 引导中执行 SQL 查询具有 WHERE 条件的 JPA 选择查询示例 …

动态SQL

动态SQL 可以根据具体的参数条件,来对SQL语句进行动态拼接。比如在以前的开发中,由于不确定查询参数是否存在,许多人会使用类似于where 1 1 来作为前缀,然后后面用AND 拼接要查询的参数,这样,就算要查询的…