面试官:this和super有什么区别?this能调用到父类吗?
本文已收录《Java常见面试题》:https://gitee.com/mydb/interview
this 和 super 都是 Java 中常见的关键字,虽然二者在很多情况下都可以被省略,但它们在 Java 中所起的作用是不可磨灭的。它们都是用来起指代作用的,每个类在实例化的时候之所以能调用到 Object 类(Object 类是所有类的父类),全是二者的“功劳”。
1.super 关键字
super 是用来访问父类实例属性和方法的。
1.1 super 方法使用
每个实例类如果没有显示的指定构造方法,那么它会生成一个隐藏的无参构造方法。对于 super() 方法也是类似,如果没有显示指定 super() 方法,那么子类会生成一个隐藏的 super() 方法,用来调用父类的无参构造方法,这就是咱们开篇所说的“每个类在实例化的时候之所以能调用到 Object 类,就是默认 super 方法起作用了”,接下来我们通过实例来验证一下这个说法。
PS:所谓的“显示”,是指在程序中主动的调用,也就是在程序中添加相应的执行代码。
public class SuperExample {
// 测试方法
public static void main(String[] args) {
Son son = new Son();
}
}
/**
* 父类
*/
class Father {
public Father() {
System.out.println("执行父类的构造方法");
}
}
/**
* 子类
*/
class Son extends Father {
}
在以上代码中,子类 Son 并没有显示指定 super() 方法,我们运行以上程序,执行的结果如下:

从上述的打印结果可以看出,子类 Son 在没有显示指定 super() 方法的情况下,竟然调用了父类的无参构造方法,这样从侧面验证了,如果子类没有显示指定 super() 方法,那么它也会生成一个隐藏的 super() 方法。这一点我们也可以从此类生成的字节码文件中得到证实,如下图所示:

super 方法注意事项
如果显示使用 super() 方法,那么 super() 方法必须放在构造方法的首行,否则编译器会报错,如下代码所示:

如上图看到的那样,如果 super() 方法没有放在首行,那么编译器就会报错:提示 super() 方法必须放到构造方法的首行。
为什么要把 super() 方法放在首行呢?
这是因为,只要将 super() 方法放在首行,那么在实例化子类时才能确保父类已经被先初始化了。
1.2 super 属性使用
使用 super 还可以调用父类的属性,比如以下代码可以通过子类 Son 调用父类中的 age 属性,实现代码如下:
public class SuperExample {
// 测试方法
public static void main(String[] args) {
Son son = new Son();
}
}
/**
* 父类
*/
class Father {
// 定义一个 age 属性
public int age = 30;
public Father() {
super();
System.out.println("执行父类的构造方法");
}
}
/**
* 子类
*/
class Son extends Father {
public Son() {
System.out.println("父类 age:" + super.age);
}
}
以上程序的执行结果如下图所示,在子类中成功地获取到了父类中的 age 属性:

2.this 关键字
this 是用来访问本类实例属性和方法的,它会先从本类中找,如果本类中找不到则在父类中找。
2.1 this 属性使用
this 最常见的用法是用来赋值本类属性的,比如常见的 setter 方法,如下代码所示:

上述代码中 this.name 表示 Person 类的 name 属性,此处的 this 关键字不能省略,如果省略就相当于给当前的局部变量 name 赋值 name,自己给自己赋值了。我们可以尝试一下,将 this 关键字取消掉,实现代码如下:
class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class ThisExample {
public static void main(String[] args) {
Person p = new Person();
p.setName("磊哥");
System.out.println(p.getName());
}
}
以上程序的执行结果如下图所示:

从上述结果可以看出,将 this 关键字去掉之后,赋值失败,Person 对象中的 name 属性就为 null 了。
2.2 this 方法使用
我们可以使用 this() 方法来调用本类中的构造方法,具体实现代码如下:
public class ThisExample {
// 测试方法
public static void main(String[] args) {
Son p = new Son("Java");
}
}
/**
* 父类
*/
class Father {
public Father() {
System.out.println("执行父类的构造方法");
}
}
/**
* 子类
*/
class Son extends Father {
public Son() {
System.out.println("子类中的无参构造方法");
}
public Son(String name) {
// 使用 this 调用本类中无参的构造方法
this();
System.out.println("子类有参构造方法,name:" + name);
}
}
以上程序的执行结果如下图所示:

从上述结果中可以看出,通过 this() 方法成功调用到了本类中的无参构造方法。
注意:this() 方法和 super() 方法的使用规则一样,如果显示的调用,只能放在方法的首行。
2.3 this 访问父类方法
接下来,我们尝试使用 this 访问父类方法,具体实现代码如下:
public class ThisExample {
public static void main(String[] args) {
Son son = new Son();
son.sm();
}
}
/**
* 父类
*/
class Father {
public void fm() {
System.out.println("调用了父类中的 fm() 方法");
}
}
/**
* 子类
*/
class Son extends Father {
public void sm() {
System.out.println("调用子类的 sm() 方法访问父类方法");
// 调用父类中的方法
this.fm();
}
}
以上程序的执行结果如下:

从上述结果可以看出,使用 this 是可以访问到父类中的方法的,this 会先从本类中找,如果找不到则会去父类中找。
3.this 和 super 的区别
1.指代的对象不同
super 指代的是父类,是用来访问父类的;而 this 指代的是当前类。
2.查找范围不同
super 只能查找父类,而 this 会先从本类中找,如果找不到则会去父类中找。
3.本类属性赋值不同
this 可以用来为本类的实例属性赋值,而 super 则不能实现此功能。
4.this 可用于 synchronized
因为 this 表示当前对象,所以this 可用于 synchronized(this){....} 加锁,而 super 则不能实现此功能。
总结
this 和 super 都是 Java 中的关键字,都起指代作用,当显示使用它们时,都需要将它们放在方法的首行(否则编译器会报错)。this 表示当前对象,super 用来指代父类对象,它们有四点不同:指代对象、查找访问、本类属性赋值和 synchronized 的使用不同。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析
面试官:this和super有什么区别?this能调用到父类吗?的更多相关文章
- 当面试官问你GET和POST区别的时候,请这么回答.......
文章内容转载于微信公众号WebTechGarden 一.GET和POST的'普通'区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就 ...
- 【对线面试官】CountDownLatch和CyclicBarrier的区别
<对线面试官>系列目前已经连载31篇啦,这是一个讲人话面试系列 [对线面试官]Java注解 [对线面试官]Java泛型 [对线面试官] Java NIO [对线面试官]Java反射 &am ...
- 在面试官问你BS和CS区别的时候如何回答??
这是我下来整理好的,如果哪里不全,望大家多多指教 C/S是Client/Server的缩写.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Inform ...
- 如何用json 与jsonp 的区别去回答你的面试官?
常常 有面试官这样问我们,虽然用过无数次,但是回答不上岂不是尴尬,那我们浅析一下它们的区别? 1. json JSON是一种基于文本的数据交换格式,用于描述复杂的数据,举个例子: var nax=[ ...
- 接口测试彻底弄懂Session、Cookie、Token的区别及联系hold住面试官--hold住了开3万,hold不住开3K!
一.前言:接口测试之伤:cookie,session,token本是一家! cookie,session,token的区别早就已经成为测试同行的心病,各大论坛,各大博客,各大视频网站无不充斥着各种疑问 ...
- 面试官:你说你懂i++跟++i的区别,那你会做下面这道题吗?
面试官:你说你懂i++跟++i的区别,那你知道下面这段代码的运行结果吗? 面试官:"说一说i++跟++i的区别" 我:"i++是先把i的值拿出来使用,然后再对i+1,++ ...
- Get与Post的区别?(面试官最想听到的答案)
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- 面试官:小伙子,你给我说一下Java Exception 和 Error 的区别吧?
前言 昨天在整理粉丝给我私信的时候,发现了一个挺有意思的事情.是这样的,有一个粉丝朋友私信问我Java 的 Exception 和 Error 有什么区别呢?说他在面试的时候被问到这个问题卡壳了,最后 ...
- [每日一题]面试官问:for in和for of 的区别和原理?
关注「松宝写代码」,精选好文,每日一题 时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
随机推荐
- C# / VB.NET 在Word中嵌入多媒体(视频、音频)文件
Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...
- Vue函数防抖和函数节流
函数防抖(debounce) 应用场景 登录.发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防 ...
- 学习java 6.29
今天是学习Java的第一天. 学习内容:了解了JDK的下载和安装: 学会了如何配置Path环境变量及安装eclipse: 执行了HelloWorld案例: 在Java中关键字需要小写,Java中最基本 ...
- A Child's History of England.19
The King was at first as blind and stubborn as kings usually have been whensoever [每当] they have bee ...
- 零基础学习java------day12------数组高级(选择排序,冒泡排序,二分查找),API(Arrays工具类,包装类,BigInteger等数据类型,Math包)
0.数组高级 (1)选择排序 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的起始位置 ...
- 通信方案软件设计(环形动态申请内存,支持USART+IIC+SPI+CAN协议
1 <STM32进阶之串口环形缓冲区实现>中讲得比较清楚(链接) 2 amobbs中讲的方法有点复杂,以下是链接和参考源码: 通信方案软件设计(环形动态申请内存,支持USART+IIC+S ...
- haproxy动态增减主机与keepalived高级应用
一:本文将详细介绍haproxy的配置使用以及高级功能的使用,比如通过haproxy进行动态添加删除负载集群中的后端web服务器的指定主机,另外将详细介绍keepalived的详细配置方法.配置实例及 ...
- UNIX基本命令
### 1. 必学命令 help [子命令] : 查看某一个具体的子命令的使用方法### 2. 常用命令 - cd path : 将当前路径切换到path路径 - pwd : 查看当前所在路径 - l ...
- 【编程思想】【设计模式】【结构模式Structural】MVC
Python版 https://github.com/faif/python-patterns/blob/master/structural/mvc.py #!/usr/bin/env python ...
- Linux:sqlplus
[oracle@hb shell_test]$ cat echo_time #!/bin/sh 一.最简单的调用sqlplus sqlplus -S "sys/unimas as sysdb ...