Java中 this 和 super 的用法与区别

news2024/12/24 9:11:36

在Java的学习与开发者我们经常遇到thissuper关键字,那么它们的用法和区别是什么呢?

一、this关键字

1.this是什么?

this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针

2.this的用法

this 的用法在 Java 中大体可以分为3种:

(1)普通的直接引用

最简单的用法,this 相当于是指向当前对象本身。

(2)形参与成员名字重名,用 this 来区分:

示例:

public class Animal {

	public String name;
	public int health;
	public int love;
	
	public Animal() {无参构造
	}

	public Animal(String name, int health, int love) {//有参构造方法
		this.name = name;
		this.health = health;
		this.love = love;
	}
}

在创建一个类,并且声明许多属性后,我们一般都要为这个类创建无参和有参构造方法,而在有参方法的参数列表中,我们会发现形参的名字与属性名相同,这时我们就需要用this关键字来区分,不然就会无法实现我们想要的效果。

(3)引用构造函数

注意:在一个构造方法中通过this关键字调用其它构造方法的时候,this关键字需要写在构造方法中的第一行位置。

示例:

public class ThisDemo01 {

	public String name;
	public String age;


	public ThisDemo01() {
		System.out.println("ThisDemo01类中的无参构造方法");
	}

	public ThisDemo01(String name, String age) {
		//在一个构造方法中通过this关键字调用其它构造方法的时候,this关键字需要写在构造方法中的第一行位置
		this();
		System.out.println("ThisDemo01类中的有参构造方法");
		//this();
		this.name = name;
		this.age = age;
		
	}
	
public static void main(String[] args) {
		
		ThisDemo01 thisDemo01 = new ThisDemo01();
		
		System.out.println("---------------");
		
		ThisDemo01 thisDemo012 = new ThisDemo01("张三", "22");

	}
	
	
	

}

结果:

 二、super关键字

1.super是什么?

super 可以理解为是指向自己父(根、超)类对象的一个指针,而这个父类指的是离自己最近的一个父类。

2.super的用法

super 也有三种用法:

(1)普通的直接引用

与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。

(2)子类中的成员变量或方法与父类中的成员变量或方法同名:

class Country {
    String name;
    void value() {
       name = "China";
    }
}
  
class City extends Country {
    String name;
    void value() {
    name = "Shanghai";
    super.value();      //调用父类的方法
    System.out.println(name);
    System.out.println(super.name);
    }
  
    public static void main(String[] args) {
       City c=new City();
       c.value();
       }
}

结果:

Shanghai
China

可以看到,这里既调用了父类的方法,也调用了父类的变量。若不调用父类方法 value(),只调用父类变量 name 的话,则父类 name 值为默认值 null。

(3)引用构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

//父类:
public class Animal{
	private String name;
	private int health;
	private int love;
	
	public Animal() {
	}

	public Animal(String name, int health, int love) {
		this.name = name;
		this.health = health;
		this.love = love;
	}

//子类:
public class Dog extends Animal{

	// 品种
	private String strain;

	public Dog() {
	}

	public Dog(String name, int health, int love, String strain) {
		super(name, health, love);
		this.strain = strain;
	}

由上述代码可以看到,我们可以在子类的构造方法中用super关键字调用父类具有同样参数的构造方法,减少代码量。

(4)super的一些限制:

 super只能出现在子类的方法和构造方法中 ;

super调用构造方法时,只能是第一句 ;

super不能访问父类的private成员;

this() 和 super() 都指的是对象,所以,均不可以在 static 环境中使用。包括:static 变量,static 方法,static 语句块。 

三、super和this关键字的异同

(1)super(参数)调用基类中的某一个构造函数(应该为构造函数中的第一条语句)

(2)this(参数)调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

(3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用 this 来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用 this 来指明成员变量名)

(4)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用 super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

(5)super() this() 类似,区别是,super() 从子类中调用父类的构造方法,this() 在同一类内调用其它方法

(6)super() 和 this() 均需放在构造方法内第一行。

(7)尽管可以用this调用一个构造器,但却不能调用两个。

(8)this 和 super 不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

(9)this() 和 super() 都指的是对象,所以,均不可以在 static 环境中使用。包括:static 变量,static 方法,static 语句块。

(10)从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个 Java 关键字。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaScript之数组中reduce的详细介绍及使用

一、reduce功能接受及定义(自我理解) reduce方法为数组中的一个高阶函数,接受两个参数,第一个参数为回调函数,第二个为初始值。如果不给入初始值则会以数组第一项为初始值!reduce会循环数组每一项&#xf…

数据库-深度剖析mysql索引原理(上)(三)

目录 一、什么是索引 二、索引由来 三、索引本质 四、索引数据结构 1、hsah 2、Btree 五、myISAM 和Innodb这两个数据库的索引是如何实现的呢? 1、首先看 MYSAM 1、以主键Id字段建立索引 2、以name字段来建立索引 2、在看Innodb数据库引擎的数据库 1、以…

Linux安装Jenkins详细步骤

安装jdk yum安装不需要配置环境变量 安装maven 下载maven 压缩包上传至服务器 解压缩 修改maven配置文件镜像地址 配置环境变量 安装Git 安装Jenkins war包下载 安装运行Jenkins 安装jdk 【Linux】Linux8 安装 JDK(适用于各个版本)_写bug的程…

JavaScript 数值 Number

目录1 数值 number1.1 数值储存1.2 数值表示1.2.1 数值分隔符1.3 特殊数值1.3.1 正零和负零1.3.2 NaN1.3.3 Infinity1.4 数值相关的全局方法1.5 Number 对象1.5.1 Number()1.5.2 Number 静态属性1.5.3 Number 静态方法1.5.4 Number 实例方法1.5.5 自定义方法1.6 Math 对象1.6.1…

ev-MOGA多目标进化算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

如何在 Windows 10 中安装 Azure Data Studio 1.39.1

安装 Azure Data Studio 1.39.1 官网下载 Azure Data Studio 1.39.1安装 Azure Data Studio 1.39.1Azure Data Studio 是一个跨平台数据库工具,适用于在 Windows、macOS 和 Linux 上使用本地和云数据平台的数据专业人员。 Azure Data Studio 提供了 IntelliSense、代码片段、源…

Java实现基于RSA的数字签名

加密与数字签名的区别 1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。 2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。 数字签名的应用 问题:在比特币中,怎么证明这个交易是你发布的? 这是就需要用到数字…

客户关系应该如何管理?

网络经过十多年的产业发展,中国的网络用户已经超过了8亿,网络也渐渐改变了盲目的商业价值追求,趋于稳定理性,已经开始向着多个路径全面性产业发展。网络上出现了各式各样的网络营销方式,如邮件网络营销、广告行业、浏览…

【python实战】朋友因股票亏了,很惨常愤恨不平,当天我就分析出原因:怎么做到的?(听说关注我的人会暴富)

导语 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 对于大部分股票投资者来说,一年能拿住翻倍的股票就实属不易。一年10倍,甚至…

生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN

编号: 162943中文名称: 生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN英文名: Biotin-εAhx-Gly-Leu-Lys-Leu-Arg-Phe-Glu-Phe-Ser-Ly英文同义词: Biotinyl-LC-hCAP-18 (134-170) (Scrambled), Biotinyl-LC-Cationic Antimicrobial Protein 18 (134-170) (human) …

hi mate, lets recall the bloody “JOIN“

补补数据库基础 上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。 注意:多表连接查询会比直接使用自带的API查询表中的一个属性&#xff0…

基于STM32单片机的智能窗帘系统

本设计是基于STM32单片机的智能窗帘系统,主要实现以下功能: 1、 定时模式:早上(7:00)自动打开窗帘,晚上(19:00)自动关闭窗帘。 2、 手动模式:通过按键实现对…

处理 S4过账时的错误:“更正统一日记账分类账的定制设置”

目录 一、问题起因 二、问题分析​​​​​​​ 三、解决方法: 一、问题起因 在一个新配置的S4系统做FI凭证出现了如下报错: 点开后,报错显示如下: 更正统一日记账分类账的定制设置 消息号 FINS_ACDOC_CUST201 诊断 通用日记账的分类账…

SCADA系统在石油炼制行业的应用:如何实现石油炼制过程实时数据采集与监控?

一、应用背景 随着经济的逐步发展,企业开始关注基础技术和生产质量的提升。其中,作为基础工业项目的石油炼制企业需要对整体技术进行集中的整合,强化基础动态生产调度以及系统化的电子商务结构,才能提升整个行业的市场竞争力。 …

抢跑“补盲”风口,纯固态激光雷达上车面临哪些挑战?

未来两年,激光雷达市场高速发展的同时,来自市场的需求也逐渐清晰化。 高工智能汽车研究院预测数据显示,预计2025年前装标配激光雷达交付将有望达到200万颗/年的规模。其中,面向私人消费市场的车型,将主要以1颗前向、2…

“如何实现高效的应用交付”鲁班会开发者训练营厦门站进行时

摘要:2022年11月18日,来自厦门创新中心的40余位开发者,齐聚华为云鲁班会开发者训练营厦门站,与华为云技术大咖共同探讨技术未来,落地应用交付。为了抓住新时代IT技术脉搏,一同探讨企业数字化转型中面临的种…

Qt富文本处理

一、富文本文档结构 文本文档由 QTextDocument 类表示,该类包含有关文档内部表示、结构的信息,并跟踪修改以提供撤消/回撤功能。 1.1、基本结构 每个文档始终包含一个根框架,并且始终包含至少一个文本块。 框架/表格总是由文档中的文本块…

16.PyQt5中的事件系统之事件(QEvent)的传递(分发)和处理

PyQt5中的事件系统之事件(QEvent)的传递(分发)和处理 使用Qt编程,几乎不用考虑事件,因为当产生某种事件时,Qt窗口部件都会发射一个相应的信号(即Qt会把事件转换为一个对应的信号),比如按钮被按下时&#x…

Servlet是什么?怎么使用?

前言: 服务器里面资源分为动态资源和静态资源 动态资源:Servlet、Jsp 静态资源:HTML、CSS、JS 一、概念 1.什么是servlet? 本质上是一个接口,提供了规范。是java提供的一门动态的web资源开发技术。 2.servlet体…

【C++】string类超详细解析

参考文献:C标准库官网 前言:在C/C的学习过程当中一定一定要多刷题,牛客网作为国内内容超级丰富的IT题库,尤其是它的C、C,有从入门到大厂真题,而且大部分的考试题目也是从中抽取,还有很多面经&am…