面向对象特征一:封装性

9.1 为什么需要封装?
我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗?有必要
碰电动机吗?
我要开车,我不需要懂离合、油门、制动等原理和维修也可以驾驶。
客观世界里每一个事物的内部信息都隐藏在其内部,外界无法直接操作和修改,只能通过指定的方
式进行访问和修改。
随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要
遵循 高内聚、低耦合
高内聚、低耦合是软件工程中的概念,也是 UNIX 操作系统设计的经典原则。
内聚,指一个模块内各个元素彼此结合的紧密程度;耦合指一个软件结构内不同模块之间互连程度
的度量。内聚意味着重用和独立,耦合意味着多米诺效应牵一发动全身。
高内聚,低耦合 的体现之一:
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅暴露少量的方法给外部使用,尽量方便外部调用。
9.2 何为封装性?
所谓封装,就是把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法只向可信的类或者对
象开放,向没必要开放的类或者对象隐藏信息。
通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
9.3 Java 如何实现数据封装
实现封装就是控制类或成员的可见性范围。这就需要依赖访问控制修饰符,也称为权限修饰符来控
制。
权限修饰符: public protected 缺省 private 。具体访问范围如下:

 

具体修饰的结构:
外部类: public 、缺省
成员变量、成员方法、构造器、成员内部类: public protected 、缺省、 private

 

 

9.4 封装性的体现
9.4.1 成员变量 / 属性私有化
概述:私有化类的成员变量,提供公共的 get set 方法,对外暴露获取和修改属性的功能。
实现步骤:
使用 private 修饰成员变量
private 数据类型 变量名 ;

代码如下:

public class Person {
private String name ;
private int age ;
private boolean marry ;
}

 

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

public class Person {
private String name ;
private int age ;
private boolean marry ;
public void setName ( String n ) {
name = n ;
}
public String getName () {
return name ;
}
public void setAge ( int a ) {
age = a ;
}
public int getAge () {
return age ;
}
public void setMarry ( boolean m ){
marry = m ;
}
public boolean isMarry (){
return marry ;
}
}

 测试:

public class PersonTest {
public static void main ( String [] args ) {
Person p = new Person ();
// 实例变量私有化,跨类是无法直接使用的
/* p.name = " 张三 ";
p.age = 23;
p.marry = true;*/
p . setName ( " 张三 " );
System . out . println ( "p.name = " + p . getName ());
p . setAge ( 23 );
System . out . println ( "p.age = " + p . getAge ());
p . setMarry ( true );
System . out . println ( "p.marry = " + p . isMarry ());
}
}
成员变量封装的好处:
让使用者只能通过事先预定的方法来 访问数据 ,从而可以在该方法里面加入控制逻辑,限制对成员 变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。
便于修改 ,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问 方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9 String char[] 转为 byte[] 内部实 现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
9.4.2 私有化方法
/**
*
* @Description 自定义的操作数组的工具类
* @author 尚硅谷 - 宋红康 Email:shkstart@126.com
* @version
*
*/
public class ArrayUtil {
/**
*
* @Description int 型数组的最大值
* @author 尚硅谷 - 宋红康
* @param arr
* @return
*/
public int max ( int [] arr ) {
int maxValue = arr [ 0 ];
for ( int i = 1 ; i < arr . length ; i ++ ){
if ( maxValue < arr [ i ]){
maxValue = arr [ i ];
}
}
return maxValue ;
}
/**
*
* @Description int 型数组的最小值
* @author 尚硅谷 - 宋红康
* @param arr
* @return
*/
public int min ( int [] arr ){
int minValue = arr [ 0 ];
for ( int i = 1 ; i < arr . length ; i ++ ){
if ( minValue > arr [ i ]){
minValue = arr [ i ];
}
}
return minValue ;
}
/**
*
* @Description int 型数组的总和
* @author 尚硅谷 - 宋红康
* @param arr
* @return
*/
public int sum ( int [] arr ) {
int sum = 0 ;
for ( int i = 0 ; i < arr . length ; i ++ ){
sum += arr [ i ];
}
return sum ;
}
/**
*
* @Description int 型数组的元素的平均值
* @author 尚硅谷 - 宋红康
* @param arr
* @return
*/
public int avg ( int [] arr ) {
int sumValue = sum ( arr );
return sumValue / arr . length ;
}
// 创建一系列重载的上述方法
// public double max(double[] arr){}
// public float max(float[] arr){}
// public byte max(byte[] arr){} /**
*
* @Description 遍历数组
* @author 尚硅谷 - 宋红康
* @param arr
*/
public void print ( int [] arr ) {
for ( int i = 0 ; i < arr . length ; i ++ ){
System . out . print ( arr [ i ] + " " );
}
System . out . println ();
}
/**
*
* @Description 复制数组 arr
* @author 尚硅谷 - 宋红康
* @param arr
* @return
*/
public int [] copy ( int [] arr ) {
int [] arr1 = new int [ arr . length ];
for ( int i = 0 ; i < arr . length ; i ++ ){
arr1 [ i ] = arr [ i ];
}
return arr1 ;
}
/**
*
* @Description 反转数组
* @author 尚硅谷 - 宋红康
* @param arr
*/
public void reverse ( int [] arr ) {
for ( int i = 0 , j = arr . length - 1 ; i < j ; i ++ , j -- ){
int temp = arr [ i ];
arr [ i ] = arr [ j ];
arr [ j ] = temp ;
}
}
/**
*
* @Description 数组的排序
* @author 尚硅谷 - 宋红康
* @param arr
* @param desc 指明排序的方式。 ascend: 升序 descend: 降序
*/
public void sort ( int [] arr , String desc ) {
if ( "ascend" . equals ( desc )){ //if(desc.equals("ascend")){
for ( int i = 0 ; i < arr . length - 1 ; i ++ ) {
for ( int j = 0 ; j < arr . length - 1 - i ; j ++ ) {
if ( arr [ j ] > arr [ j + 1 ]) {
// int temp = arr[j];
// arr[j] = arr[j + 1]; // arr[j + 1] = temp;
swap ( arr , j , j + 1 );
}
}
}
} else if ( "descend" . equals ( desc )){
for ( int i = 0 ; i < arr . length - 1 ; i ++ ) {
for ( int j = 0 ; j < arr . length - 1 - i ; j ++ ) {
if ( arr [ j ] < arr [ j + 1 ]) {
// int temp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = temp;
swap ( arr , j , j + 1 );
}
}
}
} else {
System . out . println ( " 您输入的排序方式有误! " );
}
}
private void swap ( int [] arr , int i , int j ){
int temp = arr [ i ];
arr [ i ] = arr [ j ];
arr [ j ] = temp ;
}
/**
*
* @Description 查找指定的 value 值在 arr 数组中出现的位置
* @author 尚硅谷 - 宋红康
* @param arr
* @param value
* @return 返回 value 值出现的位置 或 -1 :未找到
*/
public int getValue ( int [] arr , int value ) {
// 方法:线性查找
for ( int i = 0 ; i < arr . length ; i ++ ){
if ( value == arr [ i ]){
return i ;
}
}
return - 1 ;
}
}

 

注意:
开发中,一般成员实例变量都习惯使用 private 修饰,再提供相应的 public 权限的 get/set 方法访问。
对于 final 的实例变量,不提供 set() 方法。(后面 final 关键字的时候讲)
对于 static final 的成员变量,习惯上使用 public 修饰。

总结:

面向对象特征之一:封装性1. 为什么需要封装性?
理论上:-`高内聚`:类的内部数据操作细节自己完成,不允许外部干涉;-`低耦合`:仅暴露少量的方法给外部使用,尽量方便外部调用。通俗的说:把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。2. 如何实现数据封装?2.1 权限修饰符Java规定了4种权限修饰,分别是:private、缺省、protected、public2.2 作用我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。2.3 实际案例:
在题目中,我们给Animal的对象的legs属性赋值。在实际的常识中,我们知道legs不能赋值为负数的。但是如果
直接调用属性legs,是不能加入判断逻辑的。那怎么办呢?
> 将legs属性私有化(private),禁止在Animal类的外部直接调用此属性
> 提供给legs属性赋值的setLegs()方法,在此方法中加入legs赋值的判断逻辑if(legs >= 0 && legs % 2 ==0)将此方法暴露出去,使得在Animal类的外部调用此方法,对legs属性赋值。
> 提供给legs属性获取的getLegs()方法,此方法对外暴露。使得在Animal类的外部还可以调用此属性的值。2.4 4种权限具体使用
《见课件》> 类:只能使用public、缺省修饰
> 类的内部成员:可以使用4种权限修饰进行修饰。2.5 开发中4种权限使用频率的情况:比较高:public、private比较低:缺省、protected3. 封装性的体现
> 场景1:私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改
> 场景2:将类中不需要对外暴露的方法,设置为private.
> 场景3:单例模式中构造器private的了,避免在类的外部创建实例。(放到static关键字后讲)

 

 

 

 

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

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

相关文章

乐维更改IP地址

1.1 系统IP调整 vim /etc/sysconfig/network-scripts/ifcfg-ens1921.2 Web相关服务IP变更 1.2.1 编辑/itops/nginx/html/lwjkapp/.env文件,更改ZABBIXSERVER、ZABBIXRPCURL、DB_HOST中的IP 1.2.2 进入/itops/nginx/html/lwjk_app/目录下,执行php bin/manager process-conso…

(免费分享)基于微信小程序电影院购票系统带论文

基于小程序的电影院购票管理系统【含报告】&#xff1a;前端 vue、elementui、小程序&#xff0c;后端 maven、springboot、springmvc、spring、mybatis&#xff0c;角色分为管理员、用户&#xff1b;集成小程序浏览电影&#xff0c;购票等功能于一体的系统。 目录 摘要 I Ab…

关于Devc++调试的问题以及解决STL变量无法查看

目前Devc的调试主要有以下几点&#xff1a; 1.调试不能直接查看stl变量&#xff0c;会卡死不动 2.目前单步进入只能用鼠标键按 3.若想按下一步进入函数体内&#xff0c;要在函数体内打上断点才行 4.调试到return 0 ;上一句就停了&#xff0c;不会结束程序 5.目前F2跳至断点…

elasticsearch 8.12+kibana 8.12

准备工作&#xff1a;1.下载相关的安装包放到/usr/local/ES下面 elasticsearch下载地址:Download Elasticsearch | Elastic elasticsearch-head-master下载地址:https://github.com/mobz/elasticsearch-head/archive/master.zip node下载地址:Index of /dist/ kibana地址:Downl…

nacos的各种类型的配置文件 yml 、json、 Properties、 text 等文件类型 发生变化怎么热更新,实现实时监听nacos配置文件变化

本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件 从而不用重启项目 依赖、工具类 这边就不写了 因为项目用的是 Json 类型的配置文件 所以下文 主要是对json文件进行实现 别的文件大同小异 先说扯淡的东西 在nacos 的配置文件中 dataId 这两种声明 是…

华为流量整形配置

组网需求 如图1所示&#xff0c;企业网内部LAN侧的语音、视频和数据业务通过Switch连接到RouterA的Eth2/0/0上&#xff0c;并通过RouterA的GE3/0/0连接到WAN侧网络。 不同业务的报文在LAN侧使用802.1p优先级进行标识&#xff0c;在RouterA上根据报文的802.1p优先级入队列&…

c++初阶篇----string的底层模拟

string类的模拟 目录 string类的模拟功能介绍各功能的实现类的构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数迭代器的实现string的内部容量访问成员函数string的修改成员函数string类的相关联函数string类的输入输出友元 汇总string功能的实现汇总测试代码 功能介绍 …

Containerd 介绍、安装和使用

Containerd介绍、安装和使用 文章目录 Containerd介绍、安装和使用1.containerd是什么&#xff1f;2.Containerd安装2.1 主机初始化2.1.1 设置ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 禁用swap2.1.6 设置时区 2.2 安装 containerd2.2.1 内核参数调整2.2…

【八大排序】一篇文章搞定所有排序

文章目录 1.排序的概念2.常见排序算法的实现2.1 插入排序2.1.1直接插入排序2.1.2希尔排序 2.2选择排序2.2.1直接选择排序:2.2.2堆排序 2.3交换排序2.3.1冒泡排序2.3.2快速排序Hoare法前后指针法挖坑法非递归版本 2.4归并排序递归版本非递归版本 2.5计数排序3.排序的比较 1.排序…

2024年EDM邮件营销群发平台怎么选?

在2024年选择适合的EDM&#xff08;电子邮件直接营销&#xff09;邮件营销群发平台时&#xff0c;需要考虑以下几个关键要素来评估云衔科技以及其他供应商的产品或服务是否符合您的需求&#xff1a; 一、功能完备性&#xff1a; 1、智能自动化&#xff1a;确保云衔科技提供的…

用DataGrip连接hive时报错:User: root is not allowed to impersonate plck5,解决方法

你可以尝试关闭主机校验 修改hive安装目录下conf/hive-site.xml,将hive.server2.enable.doAs设置成false <property><name>hive.server2.enable.doAs</name><value>false</value><description>Setting this property to true will have H…

警惕.360勒索病毒:如何预防.360勒索病毒攻击

导言&#xff1a; 在网络安全领域&#xff0c;勒索病毒是一种非常危险的恶意软件&#xff0c;它以其独特的加密方式和高昂的赎金要求&#xff0c;给个人和企业带来了严重的损失。.360勒索病毒便是其中之一&#xff0c;它属于BeijingCrypt勒索病毒家族&#xff0c;具有高度的隐…

office安装和卸载

目录 安装文件下载安装破解卸载 安装文件下载 链接&#xff1a;https://pan.baidu.com/s/1cBRv-NwNOf2pQyd7XBRu6A?pwdabcd 提取码&#xff1a;abcd 提供内容如下: ├── pdf │ ├── Access2007宝典.pdf │ ├── Excel2007宝典.pdf │ ├── Project2007完全掌…

scGRN:人与鼠的GRN平台

基因调控网络GRN是包含转录因子TFs与其下游靶基因之间的调控相互作用的可解释图模型。了解GRN的拓扑结构和动力学是解释疾病病因机制和将相应发现转化为新疗法的基础。单细胞多组学技术的最新进展促使从单细胞转录组学和表观基因组学数据中以前所未有的分辨率推断GRN。在这里&a…

ClickHouse03-小白如何快速搭建ClickHouse集群

普通测试通常使用ClickHouse单节点就可以了&#xff0c;但是生产环境不免需要考虑多活、负载等高可用问题&#xff0c;集群就成了基础需求 ClickHouse在集群的选择上&#xff0c;作者已知的有两种&#xff1a; 使用ZooKeeper作为节点协调的组件&#xff0c;使用ClickHouse-Kee…

红米手机Redmi 不会自动弹出USB调试选项,如何处理?(红米小米均适用)

参考&#xff1a; 红米手机Redmi 不会自动弹出USB调试选项&#xff0c;如何处理&#xff1f;&#xff08;红米小米均适用&#xff09; - 知乎 以红米9A为例&#xff1b; 【设置】菜单进入后&#xff0c;找到【我的设备】&#xff0c; 选择【全部参数】&#xff0c; 对准miui版…

SQL96 返回顾客名称和相关订单号(表的普通联结、内联结inner join..on..)

方法一&#xff1a;普通联结 select cust_name, order_num from Customers C,Orders O where C.cust_id O.cust_id order by cust_name,order_num;方法二&#xff1a;使用内连接 select cust_name,order_num from Customers C inner join Orders O on C.cust_id O.cust_id …

测试人员如何提交一条高质量的bug

测试人员在测试软件过程中&#xff0c;发现bug是必然的&#xff0c;那么发现bug后就要提交bug到缺陷管理系统中&#xff0c;如何提交一条高质量的bug&#xff0c;是每一个测试人员值得深思的问题&#xff0c;如果bug提交的不规范&#xff0c;不准确会导致开发人员理解错误&…

Python工具箱系列(五十一)

九宫格与词云 对图片进行九宫格切割&#xff0c;并且放到微信朋友圈曾经风靡一时。对于python来说&#xff0c;这个也非常简单。 from PIL import Image import mathdef ninerectanglegrid(inputfilename):"""实现九宫格切割Args:inputfilename (string): 输入…

golang import引用项目下其他文件内函数

初始化项目 go mod init [module名字] go mod init project 项目结构 go mod 文件 代码 需要暴露给外界使用的变量/函数名必须大写 在main.go中引入&#xff0c;当前项目模块名/要引用的包名 package mainimport (// 这里的路径开头为项目go.mod中的module"project/…