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