共计 1694 个字符,预计需要花费 5 分钟才能阅读完成。
明天就用最通俗易懂的大白话来聊一聊 Java 中的 this 和 super 以及 this() 和 super()。
1、this 关键字
package com.cj.study.thissuper;
public class Student{
public String name;
public void setName(String name) {this.name = name;}
public String getName() {return name;}
}
上述代码是很常见的 javabean 的定义,里边常常会呈现 this 这个关键字
那有思考过为什么这里须要用 this 这个关键字吗?
为了更简略的解释这个问题,将上述的代码改一下:
把 set 办法里的 this.name 的 this 去掉,变成了 name=name,就会发现个问题,这 2 个 name 都是局部变量的 name,这就变成了局部变量给局部变量赋值了,然而咱们是想给对象的 name 赋值,并不是想给局部变量赋值,因为名称一样导致辨别不进去了。
所以必须用 this 来辨别一下;当然如果两个不重名的话,name=nnn 这种的不加 this 是没问题的,这是因为它是先在部分找变量,如果找到了就用局部变量,没找到就去找全局变量。
那这个 this 到底是啥呢?
this 是 以后对象 的援用,就是说以后用构造函数建的对象是谁,这个 this 就代表谁,它是一个援用
另外一个问题,如果 构造函数 想调用另一个构造函数该怎么办呢?
这个时候就须要应用 this()了
留神:如果在构造函数里调用其余重载的构造函数时,则,被调用的那个构造函数必须放在代码的第一行
下边是示例:
正确的
谬误的
2、super 关键字
上述例子是父类里定义了一个字段是 num,子类里没有定义,所以最初的输入后果是 showNum=4
然而如果子类也定义了一个 num 值为 5,那打印进去的肯定是 5,因为在调用成员(成员变量和成员办法)时如果不非凡表明,前边其实默认省略了 this,他默认调用的是子类的
然而如果这时候我就想用父类的不想用子类的,怎么办
这时候又呈现了辨别不进去的状况,所以要用 super 来表明你要调用父类的,而不是子类的
当只有父类有,子类没有的状况下,则调的是父类的(因为子类继承了父类,子类就领有了父类出了公有外的所有货色)
当父类和子类都有的状况下,默认调用的是子类的,然而用 super 表明了当前调的是父类的
如上图所示,this 和 super 的援用是这样指向对象的成员变量和办法。
this 指向了不仅父类可继承的成员变量和可继承的办法外,它还指向了子类的成员变量和办法
而 super 仅仅只是指向了子类对象中从父类继承的成员变量和办法。
那如果子类 构造函数 想调用父类的 构造函数, 怎么办?
这时候能够用 super();
留神: 在子类的构造函数里都必须去调用父类的构造函数,你不写其实第一行都有一个隐式的 super();
如果父类里不定义无参的结构的话子类的构造函数会报错,所以阐明在子类的构造函数默认的都有一句隐式的 super();
你的构造函数里默认的都有一个隐式的 super(); 去调用父类无参的结构,然而如果你的构造函数里不想调用默认的父类无参结构,而是想调用父类其余的构造函数,则你能够显式的写进去,而且如果你写了则调用父类的 supper(xxx) 必须放在第一行
以上就是对 this 和 super 的一些总结,心愿对大家有所帮忙!
另外,关注公众号 Java 技术栈,在后盾回复:面试,能够获取我整顿的 Java 系列面试题和答案,十分齐全。
作者:嗑嗑磕嗑瓜子的猫 \
本文链接:https://blog.csdn.net/ju_3622…\
版权申明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接和本申明。
近期热文举荐:
1.600+ 道 Java 面试题及答案整顿(2021 最新版)
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!