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


    this



    this 表示当前对象

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

    this .

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

    输出 结果为 “3” ;
    在method()方法中,this.i=3 和i=3意思相同
    但注意, 如果在method()方法中,输入的是 int i=3.结果可以完全不同。 为什么呢?
    ~~很显然。这样做的意思是说在方法中,重新定义一个局部变量i.并非指代当前对象啊。

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

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

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

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

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

     图列说明:

    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()相互调用执行顺序:

      

    分析:

    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

  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/guankelei/p/11481555.html
Copyright © 2020-2023  润新知