/**
 * 关于关键字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
 */