详细解析Java的this和super关键字
时间:2022-04-30 [网络编程]作者:fabuyuan 浏览:6 次
推荐学习:《java视频教程》
一、“ this ”关键字的使用
1. 概述
- this是什么?
在Java中,
this
关键字比较难理解,它的作用和其词义很接近,表示“当前”的意思。
2. 作用
this
关键字可以用来修饰、调用:属性、方法、构造器。this
关键字只能在方法内部使用。
它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象。
3. 使用
- 什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用
this
。具体的:我们可以用this
来区分属性和局部变量。比如:this.name = name;
3.1 修饰属性和方法
this
理解为:当前对象或当前正在创建的对象
在类的方法中,我们可以使用this.属性
或this.方法
的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略this.
。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用this.变量
的方式,表明此变量是属性,而非形参。
使用this
访问属性和方法时,如果在本类中未找到,会从父类中查找。
代码演示:
class Person{ // 定义Person类 private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public void getInfo(){ System.out.println("姓名:" + name) ; this.speak(); } public void speak(){ System.out.println(“年龄:” + this.age); } }
3.2 调用构造器
在类的构造器中,我们可以使用
this.属性
或this.方法
的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都选择省略this.
。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用this.变量
的方式,表明此变量是属性,而非形参。
我们在类的构造器中,可以显式的使用
this(形参列表)
的方式,调用本类中指定的其它构造器。
构造器中不能通过
this(形参列表)
方式调用自身的构造器。
如果一个类中有n个构造器,则最多有 n - 1个构造器中使用了
this(形参列表)
规定:
this(形参列表)
必须声明在当前构造器的首行。
构造器内部,最多只能声明一个
this(形参列表)
,用来调用其它的构造器。
除构造器之外,编译器禁止在其它任何方法中调用构造器。
代码演示:
class Person{ // 定义Person类 private String name ; private int age ; public Person(){ // 无参构造器 System.out.println("新对象实例化") ; } public Person(String name){ this(); // 调用本类中的无参构造器 this.name = name ; } public Person(String name,int age){ this(name) ; // 调用有一个参数的构造器 this.age = age; } public String getInfo(){ return "姓名:" + name + ",年龄:" + age ; } }
3.3 返回当前对象
代码演示:
public class Leaf { int i = 0; Leaf increment(){ i++; return this; } void print(){ System.out.println("i = "+i); } public static void main(String args[]){ Leaf x = new Leaf(); x.increment().increment().increment().print();//i = 3 }}
二、“ super ”关键字的使用
1. 概述
(1)
super
理解为:父类的
(2)在Java类中使用super来调用父类中的指定操作:
super
可用于访问父类中定义的属性。
super
可用于调用父类中定义的成员方法。super
可用于在子类构造器中调用父类的构造器。
尤其当子父类出现同名成员时,可以用super
表明调用的是父类中的成员,super
的追溯不仅限于直接父类。super
和this
的用法相像,this
代表本类对象的引用,super
代表父类的内存空间的标识。
2.使用
可以在子类中显示地调用父类的结构。
3.使用
3.1 调用属性和方法
我们可以在子类的方法或构造器中。通过使用"
super.属性
“或”super.方法
“的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略”super.
"。
当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"
super.属性
"的方式,表明调用的是父类中声明的属性。
当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"
super.方法
"的方式,表明调用的是父类中被重写的方法。
3.2 调用构造器
(1)子类中所有的构造器默认都会访问父类中空参数的构造器。
(2)当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,否则编译出错。同时,只能”二选一”,不能同时出现,且必须放在构造器的首行。
(3)在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)",调用父类中的构造器。
代码演示:
public class Person { private String name; private int age; private Date birthDate; public Person(String name, int age, Date d) { this.name = name; this.age = age; this.birthDate = d; } public Person(String name, int age) { this(name, age, null); } public Person(String name, Date d) { this(name, 30, d); } public Person(String name) { this(name, 30); } }public class Student extends Person { private String school; public Student(String name, int age, String s) { super(name, age); school = s; } public Student(String name, String s) { super(name); school = s; }// 编译出错: no super(),系统将调用父类无参数的构造器。 public Student(String s) { school = s; } }
三、this和super的区别
No. | 区别点 | this | super |
---|---|---|---|
1 | 访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 直接访问父类中的属性 |
2 | 调用方法 | 访问本类中的方法,如果本类没有此方法则从父类中继续查找 | 直接访问父类中的方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
四、子类对象实例化的全过程
(1)从结果上来看:(继承性)
子类继承父类以后,就获取了父类中声明的属性或方法。
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
(2)从过程上来看:
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,…直到调用了java.lang.Object
类中空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用。
(3)明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为
new
的子类对象。
推荐学习:《java视频教程》
以上就是详细解析Java的this和super关键字的详细内容,更多请关注站长家园其它相关文章!
本文标签: java
转载请注明来源:详细解析Java的this和super关键字
本文永久链接地址:https://www.adminjie.com/post/11831.html
免责声明:
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
附:
二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!
版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的部分源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,若有侵犯你的权益请:提交版权证明文件到邮箱 2225329873#qq.com(#换为@) 站长会进行审查之后,情况属实的会在三个工作日内为您删除。
更多精彩内容
- VUE中V-IF条件判断改变元素的样式操作
- Discuz如何解决安装时报错run_sql_error
- 低版本VS项目在VS2019无法正常编译的问题
- PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
- Oracle数据库的实例/表空间/用户/表之间关系简单讲解
- RSA2是啥?PHP-RSA2签名验证怎么实现?
- 华为dubal20是什么型号
- ana an00华为是什么型号
- html5的标题标记一共有几个等级
- 电脑显示信号线无连接是什么意思
- html5中onclick是什么意思
- 小程序大小超限除了分包还能怎么做?如何避免和解决大小限制?
- app是什么应用程序的简称
- angular与bootstrap的区别是什么
- 一个邮箱可以有几个微信小程序

- 最新文章
-
-
jquery对象访问的方法有哪些
jquery对象访问的方法有:1、each(),可以遍历指定的jquery对象,语法“$.each(对象,回调函数)”;2、size(),可统计jquery对象...
-
jquery怎么根据id判断元素是否存在
判断方法:1、通过id属性值获取指定元素,语法“$("#id值")”,会返回一个包含指定元素的jQuery对象;2、使用“元素对象.length>0”语句...
-
jquery怎么删除所有li元素
删除方法:1、利用find()选取文档的所有li元素,语法“$("body").find("li")”,返回一个包含所有li元素的jQuery对象;2、利用re...
-
oracle怎么查询表的同义词
在oracle中,可以利用select语句配合“dba_synonyms”查询表的所有同义词,语法为“select*fromdba_synonyms”;同...
-
jquery如何改变img的属性值
两种改变方法:1、用attr()修改属性值,语法“$("img").attr({属性1:"值",属性2:"值"...});”。2、用prop()修改属性值,语法...
-
- 热门文章
-
-
VUE中V-IF条件判断改变元素的样式操作
这篇文章主要介绍了VUE中V-IF条件判断改变元素的样式操作,具有很好的参考价值,希望对大家有所帮助。一起跟随想过来看看吧...
-
Discuz如何解决安装时报错run_sql_error
问题环境VMware虚拟机Centos7.3PHP7.0MySQL8.0NGINX1.14Discuz3.4问题还原本地环境为PHP5.6+MySQL5.6在安...
-
低版本VS项目在VS2019无法正常编译的问题
低版本VS项目在VS2019无法正常编译的问题这里指的编译并不准确,只是为了方便说明。后有(未安装),201?...
-
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
实现原理使用redis链表来做,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用。实现步骤第一步,先将商品库存入队列/**.trigge...
-
Oracle数据库的实例/表空间/用户/表之间关系简单讲解
完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例。Oracle是一种数据库管理系统,是一种关系型的数据库管理系统。我们用这些高级权限账号...
-