Java基础篇:今天终于搞明白this和super关键字的作用了

文编|JavaBuild

大家好呀,我是JavaBuild,以后可以喊我鸟哥,嘿嘿!俺滴座右铭是不在沉默中爆发,就在沉默中灭亡,一起加油学习,厚积薄发!

兄弟们,从今天开始,俺开始肝《Java基础篇》了,从一个多月前整理出《Java学习路线大全》后项目便忙起来了,一直没空梳理,但是!从今天开始,在这里立个Flag,把之前的书从头看一遍,学起来,燥起来,琢磨起来!

今天把Java中最容易被忽视的俩常用关键字this和super给整理了一下,首先我们要明白这俩关键字的重要性,所有的对象想要实例化最终都会调到Object类,因为它是所有类的超级父类,而不管类的继承道路有多深,多崎岖,this与super都始终默默无闻的扮演着引路人的作用,牵引着我们的实例化对象,找到它最初的祖先(Object)。

1 this关键字

1.1 this之属性调用

1.1.1属性赋值

java的类中常用setter/getter方法进行属性的赋值与取值,而在setter方法中,我们就会发现this的身影,用来进行赋值时的成员变量和局部变量的区分.话不多说,直接上代码!

代码中this.name指代的是类的成员变量,而后面的name则是参数,用以将传入的参数赋值给类的属性,在成员变量和局部变量同名时,这里的this不可省略,否则指代不清,最终打印出的值为空.

当然,在成员变量和局部变量名不一致时,this是可以省略滴,如下代码,结果依旧可以正确的打印出来.

在this调用本类属性时,可以调用成员变量,不可调用局部变量,否则会报错.

1.2 this之方法调用

1.2.1this调用当前类的普通方法

代码中方法2通过this成功调用到了方法1,但通常情况下,我们会忽略this的书写,翻看字节码文件时我们会发现,即便是忽略了this,在字节码文件中也会被默认补上.

this在哪些情况下可以忽略不写?1 本类方法调用本类属性.2 本类方法调用另一个本类方法.

1.2.2this调用父类方法

这时的this也可省略.原因是,this在调用方法时,查找顺序是先用本类找,找不到时会区父类查找.

1.2.3this调用当前类的构造方法

有参无参均可调用,代码如图:

通过this()方法,成功调到了本类的无参构造方法,但需要注意的是,在构造方法中,this()必须放在第一行,否则会报错,这样可以保证构造方法在调用之前就完成了初始化.

1.2.4this作为方法中参数

this关键字在作为参数在方法中传递的时候,指向的其实就是当前类对象,上代码!

1.2.5this作为构造方法中参数

如下的代码中,在Father的构造方法中,实例化Data对象时,传入了this作为参数,其实指代的依旧是当前类对象,最终打印出来的结果为当前对象的属性age值。

1.2.6this作为方法返回值

下图代码中,我们在Father的getResult方法中返回了this,这里的this指代的是new Father()对象,因此,在我们最终的调用中,才可以father.getResult().print();这样写,这是this一种非常经典且好用的用法:链式调用!

2 super关键字

super关键字主要有如下3点作用:

  • 代表对当前对象的直接父类对象的引用

  • 可以调用父类的非 private 成员变量和方法

  • super(); 可以调用父类的构造方法,只限构造方法中使用,且必须是第一条语句

2.1 super之父类属性调用

通过super关键字我们可以在子类中调用到父类的属性,上代码

2.2 super之父类方法调用

当子类和父类之间出现方法的重名时,比如父类方法的重写,这时可以通过super进行父类方法的调用.若调用的方法只在父类中出现时,可省略super关键字.

2.3 super之父类构造方法调用

任何类在创建之处,如果没有显示的创建空构造方法的话,会默认一个空构造方法,这是super()的一条默认通道.super()也类似,在子类中如果没有显示的调用super()时,构造方法中会隐式调用super(),以此来调用父类的空构造方法,这也是文章开篇提到的"所有的对象想要实例化最终都会调到Object类"的原因.

从如上的代码中可以证明两点,1类创建时,若没有显示的创建构造方法,会默认一个空构造.2子类构造方法中会默认调用super(),去获取父类构造方法.

那我们现在来思考一个问题,如果一个父类没有默认的空构造方法会发生什么?

当我们在父类中显示的写了一个有参构造,父类的默认空构造就失效了,这时super()的默认通道就没了,此时代码报错,错误提示:"无空构造方法,请创建一个构造方法匹配super".

这时可通过显示的super(age)方法去调用父类的有参构造方法.如下图代码所示.

并且需要注意的是,在构造方法中,super()必须放在第一行,否则报错.

总结

最后,我们用一个思维脑图来总结一下super与this关键的异同点

相关推荐
JIngJaneIL7 小时前
基于java+ vue家庭理财管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
vipbic7 小时前
基于 Nuxt 4 + Strapi 5 构建高性能 AI 导航站
前端·后端
老华带你飞8 小时前
电商系统|基于java + vue电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
菠菠萝宝8 小时前
从传统后端到AI智能驱动:Java + AI 生态深度实战技术总结
java·人工智能·ai·llm·知识图谱·ai编程·rag
陈佳梁8 小时前
java--对象的引用
java·开发语言
OC溥哥9998 小时前
2D我的世界创造模式网页版正式出炉——《我们的2D创造世界:无限创意,多人同乐》欢迎来到ourcraft.xin网站上玩
后端·python·阿里云·flask·html·游戏程序
wadesir8 小时前
Java实现遗传算法(从零开始掌握智能优化算法)
java·开发语言·算法
程序媛徐师姐8 小时前
Java基于SpringBoot的智能城市管理平台,附源码+文档说明
java·spring boot·java springboot·智能城市管理平台·java智能城市管理平台·java智能城市管理·智能城市管理
tryxr8 小时前
Java抽象类特点、使用方式和应用场景
java·开发语言·向上转型·抽象类·向下转型
潲爺8 小时前
Java-多线程
java·笔记·学习