java构造器相互调用_java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序...

2023-11-10 16:00

本文主要是介绍java构造器相互调用_java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

this

this 表示当前对象

使用上细分的话,this有 this. 和this()的使用情况 ,下面我们开始细撸

this .

使用场景一: 在成员方法中,this.变量名 指带当前对象的变量,此时this.是可以省略的

5d76d94a0fe5e8aca5cb76cf4a28b647.png

输出 结果为 “3” ;

在method()方法中,this.i=3 和i=3意思相同

但注意, 如果在method()方法中,输入的是 int i=3.结果可以完全不同。 为什么呢?

~~很显然。这样做的意思是说在方法中,重新定义一个局部变量i.并非指代当前对象啊。

使用场景二 : 在成员方法中,传入的参数名称和成员变量相同时,因java中变量的就近原则,使用this,区分成员变量和传入值,此时呢是不能省略的。

27cda770d54e10827eb266694d5e60ec.png

输出 结果为 “3” 但如果此时method方法中 为i=i ,这样本身其实没有意思,但你要知道 ,形参(int i)会在栈中存储,会产生新的int i,这个变量会随着method方法弹栈后消亡,各成员变量i是俩码事

ps: 场景二的情况是传参名和成员变量名相同,this才不可以省略,那起另一个名不就行了?

没错。完全可以起其它名字。 但是为了增强代码的可读性,一般将参数的名称和成员变量的名称保持一致,所以this的使用频率在规范的代码内部应该很多。

this()

在构造器中使用,构造器间相互调用

959cc691041025c5249526baded5b765.png

511a2992f0cc5f53e7991e3324131dd9.png

图列说明:

1、先执行 main 方法,main 方法压栈,执行其中的 new Person(“张三”,23);

2、堆内存中开辟空间,并为其分配内存地址 0x33,,紧接着成员变量默认初始化(name=null age = 0);

3、拥有两个参数的构造方法(Person(String nm , int a))压栈,在这个构造

方法中有一个隐式的 this,因为构造方法是给对象初始化的,那个对象调用到这个

构造方法,this 就指向堆中的那个对象。

4、由于 Person(String nm , int a)构造方法中使用了 this(nm);构造方法

Person(String nm)就会压栈,并将“张三”传递给 nm。在 Person(String nm , int

a)构造方法中同样也有隐式的 this,this 的值同样也为 0x33,这时会执行其中

name = nm,即把“张三”赋值给成员的 name。当赋值结束后 Person(String nm ,

int a)构造方法弹栈。

5、程序继续执行构造方法(Person(String nm , int a)中的 age = a;这时会

将 23 赋值给成员属性 age。赋值结束构造方法(Person(String nm , int a)弹栈。

6、当构造方法(Person(String nm , int a)弹栈结束后,Person 对象在内存

中创建完成,并将 0x33 赋值给 main 方法中的 p 引用变量。

this 使用使用总结

在类的方法定义中使用的 this 关键字代表使用该方法的对象的引用。

this 即”自己”,代表对象本身,谁调用代表谁。在成员方法中或构造器中隐式

的传递。作用如下:

1、this 在构造器中只能放在第一行

2、this.属性避免属性和形参、局部变量同名,发生就近原则

3、this([实参列表]): 构造器的首行调用其他构造器。

4、this 可以看作是一个变量,它的值是当前对象的引用。(我的理解是  this(nm)   等同于   p.Person(nm)     )

5、this 不能出现在被 static 修饰的内容中

6、构造方法不能相互调用(即你调用我、我调用你),会报错,类似死循环

super

super 有俩种用法 1. super. 2. super() 和this的用法很相同

所以呢~~ super的介绍的我就轻了,它的使用只是在继承关系下的this使用嘛

super .

当父类 和子类 存在相同成员属性时,为区分这种俩种成员属性,会super.来指代父类中的成员属性

super()

构造器中相互调用,需在构造器代码中的第一行

子类在new 对象,进行初始化(子类的构造器进行初始化 ),会自动调用父类的空构造(使用super() )。

特别说明;我们知道 ,类中会默认有一个空构造,所有子类在初始化时,会自动调用父类的空构造。

此时,在子类的构造器中,super(); 是可以省略的 ; 但当我们已经给父类创建了带参构造器,却没有创空构造器时,此时在初始化子类时,会报错,除非手动输入一个和我们在父类中定义相同参数类型的super()才可以,如super(int a);

如果你在充分理解this的使用后的情况下,还是对super的用法不清楚,那们通往java大神的的路过于崎岖,建议改行做项目经理吧(说好啊,我可没对项目经理有意见~)

下而详细介绍下在构造器中this()和super()相互调用执行顺序,这个可以啃啃

在构造器中this()和super()相互调用执行顺序:

2666b475aebcd6385e7e58df67623855.png  

c484fb27e05e49d2dfb155fb3599b0e1.png

fe241a1b6a698d6e7a99909f1643adbf.png

分析:

new Son()时,进入Son类的空参构造器,在空参构造器中,this(3)调用同类重载构造器,进入

带参构造器中,有隐式super(),调用上层父类空参构造器,构造器中有this(39),调用同类重载构造器,进入带参构造器中,有隐匿super()

(Father类的父类为Object了,无打印信息),,然后就是一个一个的打印信息了

我们要明白一个道理,在有继承关系时,创建子类对象,无论调用无参还有带参构造,都会调用父类的构造器,对父类对象初始化(但是在

初始化父类对象前,先会执行子类中重载构造器中this()调用,执行后才会调用父类构造器,默认没有this()的构造器有隐式super(),当然也可

以指定构带参构造器)。初始化父类对象,默认进入父类的空参构造器中(此时子类构造器中有个隐匿surper()),但如果调用子类构造器中

第一行已经明确选择父类带参构造器,则进入父类带参构造器

还有一点也至关重要,当父类中有带参构造器,无空参构造,且子类中没有明确指出使用父类带参构造生成父类对象时,程序会默认使用

super()空参构造生成父类对象,此时程序会报错。原因很简单:当一个类手动加入了带参构造器,系统将不会再为你自动生成空参构造。这

时就需要我们为父类添加空参构造。

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

Other Q&A

1.为什么在构造器中this()和super()要放在代码的首行?

因为构造对象时,默认需要调用类的构造器来初始化对象,而只有产生了对象,后面才能对对象操作嘛。

是不是先有鸡,才能下蛋呢?

2.为什么在构造器中不能同时this()和super()?

嗯。它们俩个都要求放在首行,所有不能同时使用了。

但想想哦,它们是否需要同时出现呢?在构造器同级用this()调用时,最后肯定有一个“出口”,(总不能用this()循环调用闹着玩bug吧)那么,这个构造器“出口”中肯定没有this(), 它的首行其 实有一个隐式super(),指向上级父层构造器,当然你也可以指定成调用带参构造器(如super(int i))。 或者也可以这么看,当构造器中this()时,就会先进行同类构造器间的调用,如果没有this()时,就会默认有一个隐式super(),对上级父类构造器调用。

------------------------------------------------------------------------------------------------------------------------------------------------------

版权声明:本文为CSDN博主「_大帅_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/ted_cs/article/details/82526056

这篇关于java构造器相互调用_java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_42519170/article/details/114596854
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/383742

相关文章

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

浅析Java如何保护敏感数据

《浅析Java如何保护敏感数据》在当今数字化时代,数据安全成为了软件开发中至关重要的课题,本文将深入探讨Java安全领域,聚焦于敏感数据保护的策略与实践,感兴趣的小伙伴可以了解下... 目录一、Java 安全的重要性二、敏感数据加密技术(一)对称加密(二)非对称加密三、敏感数据的访问控制(一)基于角色的访问

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行