likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 3

文编|JavaBuild

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

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

1 this关键字

1.1 this之属性调用

1.1.1属性赋值

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

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

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

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

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

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

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

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

1.2 this之方法调用

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

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

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

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

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

1.2.2this调用父类方法

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

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

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

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

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

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

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

1.2.4this作为方法中参数

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

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

1.2.5this作为构造方法中参数

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

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

1.2.6this作为方法返回值

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

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

2 super关键字

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

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

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

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

2.1 super之父类属性调用

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

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

2.2 super之父类方法调用

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

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

2.3 super之父类构造方法调用

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

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

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

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

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

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

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

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

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

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

总结

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

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