首页>>后端>>java->this与super本质区别

this与super本质区别

时间:2023-12-02 本站 点击:0

1、简介

this与super是类实例化时通往Object类通道的打通者;this和super在程序中由于其经常被隐式的使用而被我们忽略,但是理解其作用和使用规范肯定是必须的。接下来将详述this与super的作用和区别。

2、引子

先来看两段代码,无报错代码示例:

packagecom.liziba.ts;/***<p>*父类示例代码*</p>**@Author:Liziba*/publicclassFather{privateStringname;publicStringgetName(){returnname;}}
packagecom.liziba.ts;/***<p>*子类示例代码*</p>**@Author:Liziba*/publicclassSonextendsFather{publicSon(Stringname){}}

此时将Father类中的构造函数修改为有参的构造函数,有错误的代码示例:

packagecom.liziba.ts;/***<p>*父类示例代码*</p>**@Author:Liziba*/publicclassFather{privateStringname;publicFather(Stringname){this.name=name;}publicStringgetName(){returnname;}}

子类代码不修改,此时子类报错:

这就是super()的隐式使用导致的报错,具体原因是因为子类Son的构造函数中隐式的调用了父类的无参构造器,相当于隐式的super(),上面报错的代码和下面这个是等价的。

但是由于父类没有显示的申明无参构造函数,此时无参构造函数被有参构造函数覆盖了,所有super()调用无法抵达父类。此时的解决办法有两种:

1、父类中声明无参构造函数

publicclassFather{publicStringname;//父类什么无参构造函数publicFather(){}publicFather(Stringname){this.name=name;}}publicclassSonextendsFather{publicSon(Stringname){super();//可以省略}}

2、子类显示的通过super调用父类的有参构造函数

publicclassSonextendsFather{publicSon(Stringname){//调用父类的有参构造函数super(name);}}

接下来将详细分析this和super的作用和区别。

3、this

this相当于当前对象实例,或者当前对象的一个引用,this有如下作用:

调用当前对象中的方法和属性

区分对象属性和方法形参

调用构造方法(必须在构造函数的第一行)

this相当于当前对象实例举例:

publicclassSonextendsFather{privateStringhomework="Java编程思想";publicvoiddoSomething(){//this相当于当前Son对象实例synchronized(this){}}}

调用当前对象中的方法和属性举例:

publicclassSonextendsFather{privateStringhomework="Java编程思想";publicvoiddoSomething(){//this获取当前对象的属性Stringhn=this.homework;//this调用当前对象的方法this.doSomething2();}publicvoiddoSomething2(){//toDo}}

区分对象属性和方法形参举例:

publicclassSonextendsFather{privateStringhomework="Java编程思想";publicSon(Stringhomework){//区分对象属性与方法形参this.homework=homework;}}

调用其他构造方法举例:

publicclassSonextendsFather{privateStringhomework="Java编程思想";publicSon(Stringhomework){//调用其他构造方法,必须在第一行this(homework,"你们未来都是架构师");}publicSon(Stringhomework,Stringname){}}

4、super

super可以理解为父类(直接父类,如果有多层继承关系这里指的是最近的父类)对象的引用。super有如下的作用:

调用父类非私有的属性和方法

区分当前类与父类同名的属性和方法

调用父类的构造函数(必须在构造函数的第一行)

调用父类属性和方法示例:

/***父类*/publicclassFather{publicStringname;publicvoiddoSomething3(){//toDo}publicvoiddoSomething4(){//toDo}}/***子类*/publicclassSonextendsFather{publicvoiddoSomething(){//调用父类的非私有方法super.doSomething3();super.doSomething4();//调用父类的非私有属性Stringname=super.name;}}

区分当前类与父类同名的属性和方法示例:

packagecom.liziba.ts;/***<p>*子类示例代码*</p>**@Author:Liziba*/publicclassSonextendsFather{publicSon(Stringname){}}0

调用父类的构造函数(必须在构造函数的第一行)

packagecom.liziba.ts;/***<p>*子类示例代码*</p>**@Author:Liziba*/publicclassSonextendsFather{publicSon(Stringname){}}1

5、总结

5.1 对比差异

this 基本概念

访问本类实例属性和方法

super 基本概念

访问父类实例属性和方法

this 查找范围

先查找本类,不存在再查找父类

super 查找范围

直接查找父类

this 其他功能

单独使用表示当前对象

super 其他功能

子类复写父类方法,用于访问父类同名方法

5.2 相同点

都是关键字,起指代作用

构造方法中必须在第一行调用其它构造函数

5.3 总结图


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/10442.html