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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JavaBuild888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值