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关键的异同点

相关推荐
Asthenia04121 小时前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz9651 小时前
ovs patch port 对比 veth pair
后端
Asthenia04121 小时前
Java受检异常与非受检异常分析
后端
uhakadotcom2 小时前
快速开始使用 n8n
后端·面试·github
JavaGuide2 小时前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9652 小时前
qemu 网络使用基础
后端
Asthenia04122 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04123 小时前
Spring 启动流程:比喻表达
后端
Asthenia04123 小时前
Spring 启动流程分析-含时序图
后端
ONE_Gua3 小时前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫