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

相关推荐
扬子鳄0081 分钟前
java注解的处理器
java
Amagi.5 分钟前
Spring中Bean的作用域
java·后端·spring
2402_8575893629 分钟前
Spring Boot新闻推荐系统设计与实现
java·spring boot·后端
繁依Fanyi32 分钟前
旅游心动盲盒:开启个性化旅行新体验
java·服务器·python·算法·eclipse·tomcat·旅游
J老熊37 分钟前
Spring Cloud Netflix Eureka 注册中心讲解和案例示范
java·后端·spring·spring cloud·面试·eureka·系统架构
蜜桃小阿雯40 分钟前
JAVA开源项目 旅游管理系统 计算机毕业设计
java·开发语言·jvm·spring cloud·开源·intellij-idea·旅游
CoderJia程序员甲40 分钟前
重学SpringBoot3-集成Redis(四)之Redisson
java·spring boot·redis·缓存
Benaso40 分钟前
Rust 快速入门(一)
开发语言·后端·rust
sco528241 分钟前
SpringBoot 集成 Ehcache 实现本地缓存
java·spring boot·后端
OLDERHARD1 小时前
Java - LeetCode面试经典150题 - 矩阵 (四)
java·leetcode·面试