Java 深入理解this关键字(通俗易懂)
Cyan_RA9
编辑于 2024年01月13日 00:02
收录于文集
JavaSE · 35篇

Author : Cyan_RA9 (CSDN同名同人)

书接上回 : 点这里!

一、this关键字(重要) : 

        1.基本概念 : 

                this [ðɪs],这、这个,表示对本类对象的引用

                Java虚拟机会给创建的每个对象分配this,代表当前对象

        2.特点 : 

                每一个创建的对象都有一个this属性,指向该对象本身(类似于指针,但在Java中叫做引用),因此this可代表当前对象,把它当作当前对象来看待。 

        3.用法 : 

                ①this.属性名;                  (可调用当前对象的属性,this.属性名就是当前对象的属性)

                ②this.方法名(参数);      (可调用当前对象的方法)

                知识延申

                        PS : this(参数列表) 可以访问本类的构造器(构造器下面会讲到)。但要注意

                        Δ此时this后不需要加"."。

                        Δ该途径只能在构造器中使用,且使用时必须置于构造器的首句。我们称之为“构造器的复用”。

        4.作用 : 

                可以解决类似我们刚刚遇到了“强龙不压地头蛇”的冲突问题。即形参名与属性名的重名问题。

        5.代码演示 : 

                ①private关键字演示Phone类setter方法中的强龙地头蛇布局定式冲突的解决 : 

                刚才p小将一针见血地指出了我们的setter方法中,形参名无法见名知意的问题,让我们难堪,这下我们可以回击p小将了。走起 : 

                Phone代码如下

                我们再来运行TestPhone类,看一下属性有没有被成功赋值。TestPhone类代码如下:

                运行结果

                可以看到三个String类型的属性都再次被成功赋值了,this 牛逼👍。其实,如果你使用快捷键生成了getter和setter方法,你会发现IDEA自动写出来的setter方法就是这么一回事儿:

                这样的setter方法其实就是正确的,常规的,一写中的的写法!😀                    

                ②this关键字调用成员变量(属性)的演示 : 

                        我们仍然使用 Phone类 与 TestPhone类 做演示,绝不是因为懒得建新的演示类的了(bushi),我们在Phone中定义一个age成员变量表示手机的累计使用年限,再定义一个printAge()方法,来打印age变量的值,特别的,我们在printAge() 方法内再定义一个局部变量age,并试图在该方法内同时打印出局部变量age和成员变量age。然后我们在TestPhone类中创建一个Phone类对象,并利用创建的Phone类对象来调用printAge() 方法。

                        Phone类代码如下

                TestPhone类代码如下: 

                输出结果

                可以看到,第一个没有用this关键字的age变量,其输出结果的确是为它赋的值10。但是,我们要注意,因为这次并没有用setAge修改age属性的值,因此输出属性age值为0整型的默认值等于0)。        

                但是,这么看对比好像不强烈,我们用setter方法来更改一下age属性的值,并将打印age的函数增加一个形参age,在显式赋值语句之前先输出传入的形参。

                Phone类代码如下: 

                TestPhone类代码如下

                输出结果

                 我们看到成员变量age的值不再是默认的0了,而是我们通过setAge() 更改后的11。

                ③this关键字调用成员方法(行为)的演示 : 

                我们在Phone类中定义一个私有方法,如下 : 

                当我们想在TestPhone类中,直接通过对象来调用icon() 方法的时候,IDEA会提示报错,如下图所示: 

                这种情况下,如果我们想继续调用该方法,就需要用到this关键字了。

                我们在Phone类中定义一个新的公共的方法,然后在这个新方法中通过this关键字来调用icon方法,如下 : 

                然后我们在TestPhone类中调用demo() 方法,就可以成功间接调用 icon方法TestPhone类代码如下: 

                输出结果

        6.深入理解this关键字 : 

                this关键字的本质到底是什么呢?

                其实,JVM在堆空间给对象分配空间时,每个对象都有一个隐藏的属性this,this指向该对象本身。即,如果用C语言来解释的话,this就是一个指向堆空间中对象本身的指针,只不过在Java中没有指针,叫做引用而已。this自己是对象的一部分,它也在堆空间,但是它又指向了它自己。

                光这么说多少有丶带抽象,来张内存图直观的表示一下,如下图:

                图解  : 

                一看图就明白了,就是这么回事儿。当然,我们还可以通过另一种直观的方法来理解this,我们可以分别输出创建的Phone类对象和this对象的哈希码值,并进行比较。进行该操作需要用到hasCode方法(之后我们会讲到hasCode)。

                代码演示 : 

                Phone类代码如下: 

                TestPhone类代码如下: 

                输出结果: 

        

                可以看到, this的哈希码值和当前对象保持一致,因此我们可以证明:谁调用本类属性或者行为,this就指向谁。

        7.hashCode相关(了解即可) : 

                ①介绍 : 

                        public int hashCode() : 

                        该方法可以根据地址值进行计算,然后返回该对象的哈希码值。支持此方法是为了提高哈希表的性能(例如java.util.Hashtable提供的哈希表)。

                ②hashCode的常规协定 : 

                        Δ在java应用程序执行期间,在对同一对象多次调用hashCode方法时,必须一致地返回相同的整数,前提是将对象进行equals比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数元需要保持一致。

                        Δ如果根据equals(Object)方法,如果两个对象是相等的,那么对这两个对象中的每个对象调用hasCode方法都必须生成相同的整数结果。

                        Δ如果根据equals(java.lang.Object)方法比较后,两个对象不相等,那么对两个对象中的任一对象上调用hasCode方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

相关内容推荐

以成长为关键词库尔勒关键词快速排名关键词训练的软件国家经济关键词总结本溪提高关键词排名电蒸锅标题关键词云岩区关键词推广服务珠海网站关键词方法关键词华为手机屏幕关键词搜索小说片段廊坊关键词推广公司冷库关键词标语大全关键词设置和布局怎么找类目关键词徐州新沂关键词seo如何提高软文关键词吴川关键词优化价格鹤壁关键词推广成本久久久关键词挖掘amazon关键词怎么写头条体育领域关键词高频关键词阈值确定海洋元素设计关键词裸心会关键词工具关键词优化行业关键词限制搜索次数快速优化关键词维护临汾网站关键词推广小爱关键词 场景创意与关键词匹配海南关键词竞价青岛关键词网络推广春药搜什么关键词关键词分析软件淘宝亚马逊法国站关键词庖丁家的关键词描写立夏的关键词木偶嘉年华关键词党史教育总结关键词本溪关键词排名网址怎么查看关键词效果怎么防止关键词下滑新津区关键词推广查找关键词的总结购物关键词检索软件电影动物世界关键词假期活动关键词英语迁安亚马逊关键词抓取自动捶背机关键词深州亚马逊关键词查询宝宝用品关键词优化sci怎么提取关键词新闻节目关键词太原引擎关键词优化生写日语关键词会计审计课关键词阿里哪里购买关键词淘宝关键词排名知识店铺关键词排名核心x站搜索关键词关键词作者王雷销售服务的关键词如何优化论文关键词抓关键词的举例根据关键词查专利动物大迁徙关键词买外套女关键词重庆关键词整站优化1688长尾关键词挖掘淘宝怎么查看关键词闲鱼灰色关键词中国风水关键词网上怎么添加关键词报志愿的关键词韶关产品关键词排名怎么设置关键词提问中国关键词中韩PDF公众号元素关键词庄子关键词100个半导体职位关键词镇江关键词排名软件2021关键词双减亚马逊st关键词字数制作QQ关键词bot雅安亚马逊关键词优化北京关键词广告排名sem关键词如何拓展大作文关键词写错在线关键词挖掘软件2019江苏经济关键词湖北关键词排名工具关键词逆水行舟有哪些长尾关键词关键词 佣兵艾琳社群的理解关键词静心思考关键词拒绝的关键词英文站点关键词修罗插件记事作文编写关键词侘寂的关键词电脑屏蔽关键词网址投资金句关键词批量修改代码关键词儿童复工的关键词消费金融关键词大全猪猫p站关键词如何选择创意关键词学习关键词的作用整合内容 整合关键词肇庆核心关键词seo广告推送关键词优化关键词丸子歌词怎么查次要关键词如何按关键词筛选淘宝客关键词采集优化系统关键词系中考关键词教学设计阿城铝单板关键词松江网站关键词优化凌海亚马逊关键词排名关键词排名用网站1688关键词找不到关键词如何单曲购买2020油管福利 关键词2022安全生产关键词2022热点关键词生活输入关键词 英文淘宝改变关键词规则中国成就论文关键词许昌关键词推广引流如何创新企业关键词中山港关键词优化sem关键词单元划分网站关键词优化定制悟空搜狗关键词排名长期热门搜索关键词英语关键词怎么取利川铝单板关键词恭王府关键词解析企业整站关键词优化关键词酷酷的英文南通360关键词推广秒收录seo 关键词卖外套的关键词皮革关键词是什么必修三历史关键词乳山seo关键词排名推特关键词2022觉醒的关键词是淘宝养关键词权重揭阳网络关键词优化吕梁网站关键词推广淘宝礼服的关键词护理研究学关键词仓鼠窝关键词替代游戏设备的关键词泽州关键词优化排名毛绒抱枕关键词武侯区网站推广关键词挖空关键词APP下载关键词怎么才能火商品标题关键词优化关键词是眼睛女神婴儿装关键词大全出道女团关键词排名excel关键词查询表衔接承接的关键词探索发现 礼物关键词红孩子电影关键词转折关键词 小学语文内蒙古 关键词中国关键词在国外商品标题关键词属性seo关键词优化好么本科大专关键词丰县优化网站关键词油管关键词好看的常州关键词排名公司如何收集问题关键词大庆亚马逊关键词挖掘coco奶茶的关键词方法关键词优化公司亚马逊关键词显示栏永州亚马逊关键词软件茂名关键词优化排名淘宝关键词回收软件以诚信为关键词点拨的意思关键词邢台关键词网络推广淘宝客关键词采集杨掌柜关键词搜索卖瑜伽裤关键词关键词依据什么来写日本雅虎关键词工具宁河关键词排名方案海洋研究方向关键词如何搜索关键词收录亚马逊船长关键词编写正能量关键词故事2022夏季女装关键词

合作伙伴

少年郎网站优化团队

www.lyhbj.cn
www.snlanyards.com
seo.urkeji.com
www.lpjfm.cn
seo.china185.com
www.wangluohr.cn
qiansan.seo5951.com
www.akz.net.cn
www.maijichuang.cn
www.te3.com.cn
www.te3.com.cn
www.he1tech.com
www.jsfengchao.com
www.lyhbj.cn
dh.jsfengchao.com
www.he1tech.com
idc.urkeji.com
www.7272w.cn
www.28j.com.cn
www.kmpower.cn