/** * 关于关键字super * 1.super是一个关键字,全部小写 * super与this对比着学习 * this: * - 能出现在实例方法和构造方法中 * - 语法结构是:"this."、和"this()" * - this不能使用在静态方法中 * - this.大多数情况下可以省略(在区分实例变量和局部变量时不可以省略。比如set方法中和构造方法中) * - this() 只能出现在构造方法的第一行,通过当前的构造方法去调用"本类中"其他的构造方法,目的是:代码复用 * super: * - 能出现在实例方法和构造方法中 * - 语法结构是:"super."、和"super()" * - super不能使用在静态方法中 * - super.大多数情况下可以省略 * - super.什么时候不能省略呢? * 父类和子类中有同名属性,或有同样的方法,想在子类中访问父类的该属性或方法,super.不能省略. * - super() 只能出现在构造方法的第一行,通过当前的构造方法去调用"父类中"其他的构造方法, * 目的是:创建子类对象的时候,先初始化父类型特征(并不是创建独立的对象)。 * - 重要结论:当一个构造方法第一行既没有this(),也没有super(),默认会有一个super();表示通过当前子类的构造方法 * 调用父类的无参构造方法,所以必须要保证父类的无参构造方法是存在的。 * - this()和super()不能共存,因为他们都需要出现在构造方法的第一行 * - 创建子类对象时,无论如何 父类中的构造方法(无参构造或有参构造)总有一个会被执行。 * - java语言中不管是new什么对象,老祖宗object类的无参是构造方法一定会执行(object类的无参是构造方法处于"栈顶部")。 * 栈顶部的特点是:最后调用,但最先执行结束(后进先出原则) * - super 不是引用,它也不保存某个对象的内存地址,所以它也不指向任何对象,它只是代表当前对象内部的那一块父类型特征。 * * super的使用: * super.属性名 [访问当前对象父类的属性] * super.方法名() [访问当前对象父类的方法] * super() [调用父类的构造方法] */ /** * 判断以下代码指向顺序 */ public class SuperText { public static void main(String[] args) { new Z(); } } class X{ public X() { //父类的这个构造方法最后被调用,最先执行 //在此构造方法的第一行默认有一行代码没有this();也没有super();就默认存在super();存在,它会调用Object的无参构造 //Object类的无参构造最后被调用,最先被执行(栈的特点:后入先出) System.out.print("1 "); } } class Y extends X{ public Y() { System.out.print("2 "); } public Y(String name){ super(); System.out.print("3 "); } } class Z extends Y{ public Z(){ this("张三"); System.out.print("4 "); } public Z(String name){ this(name,18); System.out.print("5 "); } public Z(String name,int age){ super(name); System.out.print("6 "); } } /* 程序运行结果: 1 3 6 5 4 */
Java中的关键字super
于 2022-11-23 17:26:27 首次发布