首页 > 其他分享 >关于一个构造方法中this()和super()的执行顺序?

关于一个构造方法中this()和super()的执行顺序?

时间:2022-11-13 23:15:04浏览次数:52  
标签:顺序 构造方法 Derived public 调用 super 隐式

1.通过this()调用其它构造方法,必须位于本构造方法的第一句
2.构造方法中如果第一行没有显示调用super();,那么Java都会隐式调用super();,作为父类的初始化方法
那这两个在内存中到底谁先执行呢?

假定这里讨论的构造器都没有显式的super()调用:

  • 有显式this()调用的构造器就会抑制掉该构造器里隐式的super()调用;
  • 没有显式this()调用的构造器则会得到隐式的super()调用。

this()调用会借助别的重载版本的构造器来做部分初始化,而一连串this()最后来到的构造器必然是没有显式this()调用的,这里就会有显式或隐式的super()调用。

public class Base {
    private int x;
    public Base() {
        // super(); // 这里开头没有this()调用,编译器会合成隐式的super()调用
        this.x = 42;
    }
}

public class Derived extends Base {
    private char c;
    private Object o;

    public Derived() {
        this('a'); // 这里开头有this()调用,编译器不会合成隐式的super()调用
    }

    public Derived(char c) {
        this(c, null); // 同上,不会合成super()调用
    }

    public Derived(char c, Object o) {
        // super(); // 这里开头没有this()调用,编译器会合成隐式的super()调用
        this.c = c;
        this.o = 0;
    }
}

在这个例子里,如果有 new Derived(),则一连串的构造器调用会是:

Derived()                 // 最初的new
  Derived(char)           //   经过this()
    Derived(char, Object) //     经过this()
      Base()              //       经过super()
        Object()          //         来到Object()

这就是我想说的,一连串this()的最后一个必然不再会在开头有this()调用,而这个开头没有this()调用的构造器就会得到编译器给隐式合成的super()调用。
另外并不是“子类对象包含父类对象”,而是一个子类对象的实例会包含其所有基类所声明的字段,外加自己新声明的字段。那些父类声明的字段并不构成一个完整的父类的实例。super()是让父类封装对自己所声明的字段做初始化的手段。

标签:顺序,构造方法,Derived,public,调用,super,隐式
From: https://www.cnblogs.com/nylgwn/p/16887608.html

相关文章

  • super 关键字
    super“可以看做”是直接父类对象的引用。可通过super来访问父类中被子类覆盖的方法或属性。使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。......
  • 循环队列顺序表实现
    #include<stdlib.h>#include<stdio.h>#include<stdbool.h>#include<math.h>/**循环队列的顺序存储实现队列头在队列第一个元素前不指向元素队列尾是指向队......
  • CSS 样式属性书写顺序对渲染性能到底有没有影响(实验论证-2022.11)
    在前端领域有一定工作年限,并且接触过前端蛮荒时代(前后端不分离,jQuery,纯HTML+CSS+JS)开发的小伙伴,应该对CSS样式非常熟悉。早在那个年代,前端在编写CSS代码时,已经听说业界对......
  • JAVA-构造方法
    packagecom.itheima02;publicclassStudent{privateStringname;privateintage;//构造方法publicStudent(){System.out.println("......
  • Java中的super和this关键字详解
    父类空间优先于子类对象产生在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对应的父类空间,便可以包含其父类的成员,如果父类成员......
  • 构造方法(构造器 constructor)
    构造器用于对象的初始化,而不是创建对象!构造方法是负责初始化(装修),不是建房子构造器4个要点:构造器通过new关键字调用!!构造器虽然有返回值,但是不能定义返回值类型......
  • super
    系统,会在每一个构造方法中都默认加上super();肯定会! 子类在初始化的情况下,有可能会用到父类中非私有的数据。如果父类没有初始化,那么父类中的数据就无法使用。 子......
  • 全球名校AI课程库(9)| Berkeley伯克利 · 深度无监督学习课程『Deep Unsupervised Learn
    ......
  • (在构造函数中)调用 super(props)的目的是什么?(必会)
    (在构造函数中)调用super(props)的目的是什么?(必会)点击查看代码在super()被调用之前,子类是不能使用this的,在ES2015中,子类必须在constructor中调用super()。传......
  • linux多命令的顺序执行
    当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果。(1);分号,没有任何逻辑关系的连接符。当多个命令用分号连接时,各命令之间的执行成......