Java基础11-封装(思想、访问权限、this、构造方法)

 

一、什么是封装呢?

封装是面向对象的三大特征之一。

隐藏对象的属性和实现细节,仅对外提供公共的访问方式。

①封装就是将面对对象的状态和行为看成是一个整体,将二者存放在一个独立的模块中,比如说类

②封装也是信息隐藏,把不需要让外界知道的信息隐藏起来,尽肯能隐藏对象功能实现细节,向外暴露方法,保证外界的安全访问,比如说方法

public static void SaveMan(int PhoneNumber,String name,int QQnumber,String Email,String wechant) {//我们在添加联系人时,需要传进的数据非常多而且很长,这就导致了参数列表的冗长
}
class LinkMan{int PhoneNumber;String name;int QQnumber;String Email;String wechant;//这样我们就将联系人信息封装起来了,封装到了一个类里
}

二、为什么要封装呢?

1.我们先来看下边这段代码

public class FengZhuang {
public static void main(String[] args) {Person p=new Person();p.name="asa";p.age=-17; //设置年龄的时候负数不合理,应该判断输入值是否正常//这个值是可以通过圆点运算符.来进行存取修改的,设置的数据不安全
}}
class Person{String name;int age;
}  

那我们怎么解决上述问题呢?

class Person{String name;//将年龄用权限修饰符设置为私有的,只能在本类中访问,外界无法访问。//既然我们已经将年龄设置成私有的,外界无法访问,那我们怎么去设置它的值呢?//我们专门给age提供一个公共的方法,来对他进行访问,这就是Setter和Getter方法private int age;public int getAge() {return age;}//我们可以通过set方法来对age进行访问,并且对传入的数据进行了筛选,这样就提高了数据的安全性public void setAge(int age) {if(age<0) {System.out.println("年龄不能为负数");return;//结束程序}else {this.age = age;}}
}
public class FengZhuang {
public static void main(String[] args) {Person p=new Person();p.setAge(-18);
}

当我们输入一个负数年龄时,系统会给我们返回一个提示,提示我们不能是负数,但是我们并不知道它是怎么返回来的值,怎么去判断的这些细节,我们只知道结果。

①封装提高了代码的安全性。

②隐藏了实现细节,对外提供可以访问的方式。便于调用者的使用。

③提高了代码的复用性。

 三、权限访问修饰符

封装让有些类看不到一些类里边具体做了什么,所以java提供了访问权限修饰符来一个类里边可以看到什么暴露什么,不可以看到什么暴露什么。

java中有四种访问权限修饰符,分别是private私有的,default不写,protected受保护的,public公共的

他们的访问权限如下

 

public

protected

default

private

同一类中

同一包中(子类与无关类)

 

不同包的子类

 

 

不同包中的无关类

 

 

 

注意:private只能在本类中访问,离开本类后不能直接访问,在其他类中是可以访问但不能直接访问,比如上边代码中的set和get方法就是一种间接访问private修饰符的字段方法

一般字段都是使用private修饰符来修饰,达到隐藏和安全的要求。

2.那么什么情况该用什么修饰符呢?
从作用域来看,public能够使用所有的情况。 但是又不会真正全部都使用public,那么到底什么情况该用什么修饰符呢?
1. 属性通常使用private封装起来
2. 方法一般使用public用于被调用
3. 会被子类继承的方法,通常使用protected
再就是作用范围最小原则
简单说,能用private就用private,不行就放大一级,用package,再不行就用protected,最后用public。 这样就能把数据尽量的封装起来,没有必要露出来的,就不用露出来了

四、this关键字

现在有一辆自行车,小雨和小颖分别骑了一会这辆自行车,小雨说,这辆车我骑起来真重,那么当前“我”即这辆车的使用者就是小雨,小颖说,我骑起来还好,那么当前“我”即这辆车的使用者就是小颖。this就相当于我这个字,代表的是当前对象。

class Person{String name;private int age;public int getAge() {return age;}public void setAge(int n) {if(n<0) {System.out.println("年龄不能为负数");return;}else {
//这里的n具体指什么呢?age = n;}}
}

n指我们要传入的age,当我们把它换成age

class Person{String name;private int age;public int getAge() {System.out.println(age);return age;}public void setAge(int age) {if(age<0) {System.out.println("年龄不能为负数");System.out.println(age);return;}else {System.out.println(age);age = age;System.out.println(age);}}
}

我们看到如上的输出结果,这表明get方法中的age获取到的是成员变量中的age,默认赋值0,这是因为程序遵循就近原则。

那怎么解决呢?

当成员变量和局部变量同名时,就可以用this关键字来区分,谁调用这个函数this就指的谁。

class Person{String name;private int age;public int getAge() {System.out.println(age);return age;}public void setAge(int age) {if(age<0) {System.out.println("年龄不能为负数");System.out.println(age);return;//结束程序}else {System.out.println(age);this.age = age;System.out.println(age);}}
}
public static void main(String[] args) {Person p=new Person();p.setAge(18);System.out.println(p.getAge());Person p2=new Person();p2.setAge(20);System.out.println(p2.getAge());
}

程序输出结果如上图,当p对象调用时this就指的p这个对象,p2调用时this指的p2这个对象

那程序不是就近原则吗?为什这里的get方法获取到了我们传的这个值呢?

 五、构造方法

1.什么是构造方法?它有什么作用?

构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成

其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。

class Person{String name;int    age;//无参构造,会默认就有,只是隐藏了我们看不见public Person() {super();}
}

 

在Java中,任何变量在被使用前都必须先设置初值.Java提供了为类的成员变量赋初值的专门方法。

java中创建对象时会调用类的构造方法,如果我们不重写这个构造方法,它默认的是一个无参数的构造方法

2.实例化对象

当我们重写这个构造方法后再实例化对象

如果我们不传值,编译器会报错。

当我们也将无参构造写出来后,便可以不在实例化时就传值

 内存图解

 

3.特殊性

1.构造方法作用:(1).构造出来一个类的实例 (2).对构造出来个一个类的实例(对象)初始化。
2.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
3.主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。
4.类中必定有构造方法,若不写,系统自动添加无参构造方法。接口不允许被实例化,所以接口中没有构造方法。
5.不能被static、final、synchronized、abstract和native修饰。
6.构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用。
7.构造方法分为两种:无参构造方法 有参构造方法
构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。

 8.自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法。如果写了一个有参的构造方法,就一定要写无参构造方法。

 

转载于:https://www.cnblogs.com/LuckyGJX/p/8907735.html

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

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

相关文章

值对于 int32 太大或太小_怎样将视频文件变小却对画质没有太大影响呢?

不管是我们平时没事儿时喜欢追的电视剧&#xff0c;电影&#xff0c;还是自己拍的视频&#xff0c;我们经常会遇到一个问题&#xff0c;就是视频文件太大&#xff0c;导致想要将好看好玩的视频传到手机上时&#xff0c;上传时间太长&#xff0c;而且有的时候可能上传了一半却又…

世界互联网大会上发布的《中国互联网发展报告2020》显示——中国人工智能专利申请数跃居世界第一...

文章来源&#xff1a;文汇报&#xff0c;图文如有侵权&#xff0c;请联系小编删除世界互联网大会会址乌镇互联网国际会展中心外景。新华社记者 黄宗治摄文汇报乌镇11月23日专电&#xff08;特派记者徐晶卉&#xff09;过去一年&#xff0c;5G、操作系统等技术取得突破&#xff…

hessian学习笔记

一、hessian是什么 Hessian是一个轻量级的remoting onhttp工具&#xff0c;使用简单的方法提供了RMI的功能。 相比WebService&#xff0c;Hessian更简单、快捷。采用的是二进制RPC协议&#xff0c;因为采用的是二进制协议&#xff0c;所以它很适合于发送二进制数据。——百度百…

谷歌浏览器手势_分享一些日常手势[狗头]

本文字数&#xff1a;2222字阅读时间&#xff1a;6分钟2020年05月19日星期二晴快分享一些工作中经常用到的快捷键&#xff0c;能帮助你提升工作效率&#xff0c;还能装13&#xff0c;下班时可以自豪地说一句&#xff1a;底薪到手&#xff0c;关机下班୧(๑•̀◡•́๑)૭Ctrl快…

北斗核心器件100%国产化,已接入大部分智能手机

来源&#xff1a;AI前线整理 | 冬梅、钰莹终于&#xff0c;中国在又一个领域达到核心器件 100% 纯国产。北斗核心器件国产化率 100%&#xff0c;22nm 芯片进入量产近日&#xff0c;在 2020 世界 5G 大会主论坛上&#xff0c;北斗卫星导航系统工程总设计师杨长风在会上分享了题为…

tensorrt轻松部署高性能dnn推理_NVIDIA TensorRT高性能深度学习推理

NVIDIA TensorRT高性能深度学习推理NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK。此 SDK 包含深度学习推理优化器和运行时环境&#xff0c;可为深度学习推理应用提供低延迟和高吞吐量。在推理过程中&#xff0c;基于 TensorRT 的应用程序的执行速度可比 CPU 平台的速度快…

Neuron最新研究:神经科学家测量球迷大脑对比赛的反应,试图挖掘人类的深层天性...

来源&#xff1a;brainnews2020年的1月27日早上&#xff0c;科比去世&#xff0c;父亲想办法安慰睡醒后的儿子&#xff1b;而在2020年11月26日早上&#xff0c;马拉多纳去世&#xff0c;儿子想办法安慰睡醒后的父亲。2020年&#xff0c;带走了全球无数球迷的青春。那么&#xf…

关于表情符号与UTF-8的探讨

4-23 现在无论原生还是网页端&#xff0c;表情符号绝大部分都可以正常显示&#xff0c;但是也有一部分是不能正常显示的。但存入到mysql的时候&#xff0c;不能够正常显示的表情符号&#xff0c;就会让mysql(utf-8)拜拜了。这个不仅仅是显示问题&#xff0c;很重要的一点是&…

删除数据清理oracle表空间,oracle数据库删除无用表空间及数据文件过程

应用场景&#xff1a;html数据库服务器A下的一张数据库表重建过&#xff0c;而且数据已经迁移到新表空间下&#xff0c;现遗留了一些原有的表空间数据文件在服务器上&#xff0c;耗费资源&#xff0c;如图所示&#xff1a;linux 原数据库表对应的数据文件&#xff1a;sql迁移后…

mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换

动态语言切换是很多国际化产品的需求&#xff0c;SOUI之前的版本支持静态多语言翻译&#xff0c;通过在程序启动时设置好语言翻译模块&#xff0c;在程序中打开的UI都会自动调用该翻译模块进行文字翻译&#xff0c;但是不支持运行进语言切换。最近几个网友都提到这个需求&#…

2020年中国面向人工智能“新基建”的知识图谱行业白皮书

全文共计1379字&#xff0c;预计阅读时间8分钟来源 | 艾瑞咨询&#xff08;经授权转载&#xff09;编辑 | 蒲蒲日前&#xff0c;认知智能国家重点实验室&艾瑞咨询联合发布《2020年面向人工智能“新基建”的知识图谱行业白皮书》。白皮书从善政、惠民、兴业、智融四个部分对…

海尔对话 Unity:作为数字转型的高阶形态,数字孪生发展前景不可逆

来源&#xff1a;数字化企业作为信息化发展到一定程度的必然结果&#xff0c;数字孪生正成为人类解构、描述和认识真实世界和虚拟世界的新型工具。从发展态势来看&#xff0c;数字孪生不仅是全新信息技术发展的新焦点&#xff0c;也是各国实现数字化转型的新抓手&#xff0c;还…

js整体缩小网页_SEO网页优化的原则是什么?

SEO网页优化的原则是什么?SEO优化对于网页的排名是非常重要的&#xff0c;排名高低直接影响到流量和转化&#xff0c;那么怎么优化呢&#xff0c;SEO网页优化的原则是什么?下面小编来告诉你SEO网页优化的原则。1、不要抄袭。因为独特的内容是所有搜索引擎都喜欢的&#xff0c…

蒲慕明:今人眼中的大脑之美 | 书评

圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y Cajal, 1852-1934&#xff09;来源&#xff1a; 知识分子撰文&#xff1a;蒲慕明现代神经科学起源于十九世纪末期&#xff1b;圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y&#xff09;的神经解剖学研究和他提出的神经元理…

sqlite 0转换为bit_Cisco Talos在SQLite中发现了一个远程代码执行漏洞

思科Talos的研究人员在SQLite中发现了一个use-after-free() 的漏洞&#xff0c;攻击者可利用该漏洞在受影响设备上远程执行代码。攻击者可以通过向受影响的SQLite安装发送恶意SQL命令来触发此漏洞。“Sqlite3 3.26.0的窗口函数&#xff08;Window_Function&#xff09;中存在可…

构建未来情报体系—— AI及大数据时代情报分析人员的战略价值

知远战略与防务研究所 沐俭/编译来自&#xff1a;美国战略与国际问题研究中心网站【知远导读】本篇推送编辑节选自美国战略与国际问题研究中心&#xff08;CSIS&#xff09;技术与情报专项研究小组撰写的一篇利用新兴科技提高情报分析人员的战略情报分析能力的文章&#xff0c;…

中国的自动驾驶到底发展到了什么程度?

来源&#xff1a;面包板社区中国在自动驾驶汽车&#xff08;AV&#xff09;领域投入了大量资金&#xff0c;计划大力发展汽车工业这一新兴领域&#xff0c;包括技术、初创企业、测试、法律法规和部署等各个方面。图1&#xff1a;在百度世界2020大会上&#xff0c;百度展示了其全…

数据挖掘算法_技术分享|大数据挖掘算法之KNNk近邻算法

程一舰数据技术处K最近邻(kNN&#xff0c;k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是k个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的k个邻居来代表。KNN是通过测量不同特征值之间的距离进行分类。其基本…

岩板铺地好吗_别人都说岩板好,我笑他人乐太早

若说岩板是陶瓷行业目前最火爆的产品&#xff0c;相信没有人会睁眼说瞎话表示反对。据统计&#xff0c;目前国内已建成的岩板生产线已有55条&#xff0c;计划在下半年建成/投产的岩板生产线已有17条。照此势头发展下去&#xff0c;国内岩板生产线的条数在2021年将逼近100条&…

人工智能和自然智能能否交汇?李飞飞对话斯坦福神经生物学教授Bill Newsome

作者&#xff1a;SHANA LYNCH机器之心编译编辑&#xff1a;张倩计算在神经科学中扮演了什么角色&#xff1f;在分子水平上理解大脑能否带来更好的神经网络&#xff1f;人工智能和自然智能之间是否存在一道无法逾越的鸿沟&#xff1f;会不会出现一个研究智能的统一框架&#xff…