Java——OOP三大特性之封装性(Encapsulation)通俗详细_java encapsulation-程序员宅基地

技术标签: 面向对象  Java  三大特性  通俗  封装  

面向对象(Object Oriented Programming)三大特性

1.封装(Encapsulation)
2.继承(Inheritance)
3.多态(Polymorphism)

定义

Encapsulation in Java is a mechanism of wrapping the data (variables) and code acting on the data (methods) together as a single unit. In encapsulation, the variables of a class will be hidden from other classes, and can be accessed only through the methods of their current class.
Java中的封装是一种将数据(变量)和作用于数据(方法)的代码打包为一个单元的机制。在封装中,类的变量将对其他类隐藏,并且只能通过当前类的方法访问。[^1]

封装在生活中的例子

例如,将你的卧室看作一个对象,卧室内部的装饰物,家具等本应都是卧室的私有属性,但是如果没有墙壁的遮挡,别人就会对屋里的任何东西一清二楚,甚至你在卧室里的一举一动都会被别人看到。正是因为这堵墙的存在,卧室的装饰品,家具等才不被外界所看到,我们甚至在卧室任意更改家具位置,改变装修风格也不会影响到其他人。但是没有门,这个被包裹的严严实实的黑盒子又有什么用呢,卧室的门就是通往外界的主要途径。

封装在Java中的普遍形式

Class Person{
	private String name;
	private int age;
	private float weight;

public String getName(){
		return name;
		}
public void setName(String name){
		this.name=name;           //this.name指成员变量private String name
		}     			          //等号右侧name表示传入的name,this在此为了区分两个name
public int getAge(){
		return age;
		}
public void setAge(int age){
		this.age=age;
		}
public float getWeight(){
		return weight;
		}
public void setWeight(float weight){
		this.weight=weight;
		}

public class Test{
		public static void main(String[] args){
		Person p1 = new Person();
		p1.setName("小王");                            //设置姓名
		p1.setAge(18);								  //设置年龄
		p1.setWeight(60);                             //设置体重

		System.out.println(p1.getName());             //获取姓名
		System.out.println(p1.getAge());              //获取年龄
		System.out.println(p1.getWeight());           //获取体重
		}
}

由上图代码可以体现,封装在Java中的普遍应用形式,为三个属性(name,age,weight)分别写了get和set方法,其中可以通过get方法获取属性的值,通过set方法设置属性。


通俗说来,get和set就如同卧室的墙壁,三个属性(name,age,weight)就是卧室里的装修,家具等,通过get,set墙壁的遮挡,使得外界无法看到卧室里的东西,也无法改变,只能通过set来改变属性,get来获取属性。


外界:指其他class
卧室:指该class


封装的优点

问题:如果我们把age设置为200或者负数,虽然不会报错,但是不符合实际要求,这个问题就可以使用封装合理的解决。

Class Person{
	private String name;
	private int age;

public String getName(){
		return name;
		}
public void setName(String name){
		this.name=name;
		}
public int getAge(){
		return age;
		}
public void setAge(int age){
		if(age <= 0  || age >130){
			System.out.println("This is a wrong age! default: 18)
			this.age=18;
		}else{
			this.age=age;
		}
	}
}

public class Test{
		public static void main(String[] args){
		Person p1 = new Person();
		p1.setName("小王");                            //设置姓名
		p1.setAge(-10);								  //设置年龄
		
		System.out.println(p1.getName());             //获取姓名
		System.out.println(p1.getAge());              //获取年龄
		}
}

Console:

小王
This is a wrong age! default: 18
18

我们在age中加入了对年龄的判断,这样就有效的避免了不符合实际情况的发生。

由此可以看出,封装可以对类的内部进行改变而不影响整体结构,同时也保护来数据。对于外界而言,它的内部是隐藏的,暴露给外界的只是可以访问它的方法。

优点

1.类内部可以自由修改
2.可以对成员变量更准确的控制
3.隐藏信息,保护数据
4.降低耦合度


耦合度:耦合性是编程中的一个判断代码模块构成质量的属性,不影响已有功能,但影响未来拓展,与之对应的是内聚性

例如:卧室的窗户与墙壁,如果窗子是扣死在墙里的 ,那么修改窗子时,就必须修改墙,这就比较紧密了,但是如果你窗子是按照某种规格的 可以自由拆装的 那么修改的代价就小,耦合度也就低了
在程序中我们要求 高内聚,低耦合!

get和set在eclipse中的简单用法


鼠标右键->Source->Generate Getters and Setters->选择需要用getset的属性->generate


更多精彩尽在主页?


reference:
1.https://www.tutorialspoint.com/java/java_encapsulation.htm

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44551646/article/details/93721343

智能推荐

grib中数据读取并导出到文本文件中_grib格式转换成txt-程序员宅基地

文章浏览阅读1.1w次。最近忙着赶项目加上家里的事比较多,就没有来得及更新博客,今天主要讲解一下grib数据的查看方法和读取方法。grib数据没有找到好的可视化工具打开它,官网提供的一个可视化工具叫Metview,此工具的安装过程相当的复杂,搞了将近3个小时最后还是没有安装成功,由于项目比较紧就果断的先放弃啦。这种方法不行,还可以使用ecCodes提供的自带命令行方式把grib数据中的一条一条的消息导出到一个.txt文件..._grib格式转换成txt

QT常用编码转换_qt字符编码转换-程序员宅基地

文章浏览阅读381次。【代码】QT常用编码转换。_qt字符编码转换

网络篇01 | 入门篇-程序员宅基地

文章浏览阅读1.2k次,点赞18次,收藏24次。应用层:提供用户接口和服务的应用程序。表示层:处理数据格式转换、加密解密等功能。会话层:管理通信会话,确保数据传输的正确性。

Entering emergency mode. Exit the shell to continue._linux系统提示entering emergency mode. exit the shell t-程序员宅基地

文章浏览阅读545次。Linux虚拟机复制到另外一台AMD的机器上,启动后直接进入emergency模式。解决方式如下:解决问题:journalctl可以查看错误原因和解决办法。输入命令:#umount /dev/dm-0#xfs_repair -v -L /dev/dm-0【-L 选项指定强制日志清零,强制xfs_repair将日志归零,即使它包含脏数据(元数据更改)。】#reboot..._linux系统提示entering emergency mode. exit the shell to continue. type

AmazeUI基本样式-程序员宅基地

文章浏览阅读811次。2019独角兽企业重金招聘Python工程师标准>>> ..._amazeui宽度

win10环境下vc++6.0安装插件报unable to register........-程序员宅基地

文章浏览阅读790次。在安装显示行号插件时出现unable to register this add-in because its dllregisterserver returns an error 的错误,大体意思是该Add-in DLL注册服务返回一个错误而导致无法注册。在网上有很对修改办法,有的确实没有问题,但是有的居然需要另外下载一个插件,实在是接受不了。我的解决办法如下。(1)先关..._vc++6.0报错插件

随便推点

Python replace()函数使用详解:字符串的艺术转换-程序员宅基地

文章浏览阅读745次,点赞31次,收藏13次。在本文中,我们将深入探讨Python中replace()函数的用法,探讨如何在字符串操作中灵活运用这一功能,使得字符串转换变得轻而易举。对于想要在Python中进行字符串替换的开发者来说,这将是一个极具价值的指南。替换方法优点缺点基本替换简单易懂,适用于一般场景无法限定替换次数限定替换次数可以精确控制替换的次数,灵活应用对于大规模替换可能略显繁琐链式替换代码简洁,逻辑清晰多次替换可能会降低代码的可读性通过本文的学习,我们深入了解了Python中replace()

PAT 甲级 1001(A+B Format)-程序员宅基地

文章浏览阅读81次。PAT 甲级 1001题目要求翻译代码思路题目要求Calculate a+b and output the sum in standard format – that is, the digits must be separated into groups of three by commas (unless there are less than four digits).Input Sp...

决策树后剪枝算法(一)代价复杂度剪枝CPP-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏36次。剪枝,是一个“用准确性换取简单性”的思想。它允许决策树对训练集过拟合,再通过删除对泛化精度无贡献的子分支,从而修剪出一颗较小的树。_代价复杂度剪枝

268道Go语言面试真题及详解+100例代码实例+DDD实践-程序员宅基地

文章浏览阅读1.2k次。Go最近动静挺大的,刚刚发布的1.18包含以下几大特性:1、泛型2、模糊测试(Fuzzing)3、工作空间(Workspaces)4、20% 性能提升:Apple M1、ARM64 和 PowerPC64 用户开心了!由于 Go 1.17 的寄存器 ABI 调用约定扩展到这些架构,Go 1.18 包括高达 20% 的 CPU 性能改进。没错,过往Go被诟病最多的泛型,现在..._go语言面试题

软考中级 软件设计师资料(考点分析+复习笔记+历年真题+电子版课本)_软件设计师中级资料-程序员宅基地

文章浏览阅读3.8w次,点赞755次,收藏1.2k次。软件设计师是软考中级职称,相比高级的难度而言,中级难度较低,每个人花些时间都能顺利通过的,考试分为上午的选择题和下午的综合题,这里跟大家分享一些自己备考时使用的资料和经验一、先对自己进行评估:因为每个人的知识点掌握情况和学校教学内容的不一致,这里以我个人情况进行说明,大家做个参考就行:大家先了解一下软件设计师的考纲:有些同学刚看到考纲会有一些迷茫,感觉很多东西都没学过,没关系,没关系,没学过的也没关系!大家要明白一点,软件设计师考察的内容广度比较高,也就是内容多、杂,但是深度很浅!,也就是没学过_软件设计师中级资料

java分页算法-程序员宅基地

文章浏览阅读2.6k次。Java常用分页计算方法1// 总条数int totalRow = 101;// 每页记录数int pageSize = 20;// 总页数int totalPage = (totalRow - 1) / pageSize + 1;方法2// 总条数int totalRow = 101;// 每页记录数int pa..._java 分页算法

推荐文章

热门文章

相关标签