【Java面试题】——this 和 super 的区别

🎁个人主页:User_芊芊君子

🎉欢迎大家点赞👍评论📝收藏⭐文章

🔍系列专栏:【Java】内容概括


【前言】

在Java的世界里,thissuper是两个非常重要且容易混淆的关键字。无论是在日常开发还是面试环节,它们都是高频考点。今天,我们就来深入剖析 this 和 super 的区别与联系,帮助大家在面试中轻松应对相关问题,同时在实际编码中也能灵活运用。

文章目录:

一、什么是this 和 super

1.this关键字

this关键字代表当前对象的引用,它指向调用当前方法的对象。在类的方法中,使用 this 可以明确地访问当前对象的属性和方法,尤其是在方法参数与类的成员变量同名的情况下, this 可以避免歧义。

2.super关键字

super 关键字用于访问父类的成员,包括父类的属性、方法和构造函数。当子类中存在与父类同名的成员时,通过 super 可以访问父类的同名成员,避免子类对父类成员的隐藏和覆盖带来的访问不便。

二、this 和 super 的区别

当问到什么和什么的区别时,我们就要从他们的相同点中去找到不同的地方

【相同点】

  • 都是Java中的关键字
  • 只能在类的非静态方法中使用,用来访问非静态成员方法和字段,因为静态的是不依赖对象的
  • 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

【不同点】

对比维度 this关键字 super关键字
本质含义 指向当前对象的引用 指向父类对象的引用
访问属性 访问当前对象的属性 访问父类的属性
调用方法 调用当前对象的方法 调用父类的方法
调用构造函数 调用本类的其他构造函数 调用父类的构造函数
使用场景 解决成员变量与局部变量重名问题、链式调用构造函数 子类重写父类方法后仍需调用父类方法、子类构造函数调用父类构造函数
存在限制 不能在静态方法和静态代码块中使用 不能在静态方法和静态代码块中使用

三、代码示例

父类

java 复制代码
public class Base {
    public int a = 10;
    public int b = 20;
}

子类

java 复制代码
public class Derived extends Base{
    public int a = 100;
    public int b = 200;
    public void method(){
        System.out.println(this.a);
        System.out.println(this.b);
        System.out.println(super.a);
        System.out.println(super.b);
    }
}

调用子类函数

java 复制代码
public class Test {
    public static void main(String[] args) {
     Derived derived = new Derived();
     derived.method();
    }
}

执行结果

四、注意事项

  • 静态环境限制: this 和 super都不能在静态方法和静态代码块中使用,因为静态成员属于类本身,而不是某个具体的对象,不存在当前对象和父类对象的概念。
  • 构造函数调用顺序: 在子类的构造函数中, super() (调用父类无参构造函数)或 super(参数)(调用父类有参构造函数)必须是构造函数的第一行代码,否则会编译报错。而 this() 调用本类其他构造函数时同样需要放在第一行,所以super() 和 this() 不能同时出现在一个构造函数中。

五、总结

this 和 super 虽然都是Java中的关键字,但它们的作用和使用场景有着明显的区别。this主要用于操作当前对象的属性和方法,解决变量重名和构造函数链式调用问题;而 super 则专注于访问父类的成员,处理子类与父类成员的继承和覆盖关系。掌握好这两个关键字的使用,不仅能够提升我们的代码质量,还能在Java面试中脱颖而出。

相关推荐
CodeAmaz几秒前
Spring编程式事务详解
java·数据库·spring
没有bug.的程序员2 分钟前
微服务基础设施清单:必须、应该、可以、无需的四级分类指南
java·jvm·微服务·云原生·容器·架构
武子康5 分钟前
Java-204 RabbitMQ Connection/Channel 工作流程:AMQP 发布消费、抓包帧结构与常见坑
java·分布式·消息队列·rabbitmq·ruby·java-activemq
郑州光合科技余经理6 分钟前
海外国际版同城服务系统开发:PHP技术栈
java·大数据·开发语言·前端·人工智能·架构·php
Yorelee.8 分钟前
ms-swift在训练时遇到的部分问题及解决方案
开发语言·nlp·transformer·swift
行走的bug...11 分钟前
python项目管理
开发语言·python
appearappear17 分钟前
Mac 上重新安装了Cursor 2.2.30,重新配置 springboot 过程记录
java·spring boot·后端
CryptoRzz25 分钟前
日本股票 API 对接实战指南(实时行情与 IPO 专题)
java·开发语言·python·区块链·maven
yugi98783826 分钟前
基于M序列的直扩信号扩频码生成方法及周期长码直扩信号的MATLAB实现方案
开发语言·matlab
程序员水自流27 分钟前
MySQL数据库自带系统数据库功能介绍
java·数据库·mysql·oracle