继承_super()

创建子类实例时,会先执行父类构造函数定义的流程,再执行子类构造函数定义的流程。如下例:

    class Some{
        Some(){
            System.out.println("调用Some()");
        }
    }
    class Other extends Some{
        Other (){
            System.out.ptintln("调用Other()");
        }
    }

如果执行new Other(),是先执行Some()中的流程,再执行Other中的流程,也就是显示结果为:

    调用Some()
    调用Other()

继续看原因:
我们知道,父类中可以重载多个构造函数,如果子类构造函数中没有指定执行父类的哪一个构造函数,默认就会调用父类的无参构造函数。如果想要执行其他某一个构造函数,可以使用super()指定,例如:

class Some{
    Some(){
        System.out.println("调用Some()");
    }
    Some(int i){
        System.out.println("调用Some(int i)");
    }
}
class Other extends Some{
    Other (){
        super(10);    //指定某一构造方法,不一定打印输出。
        System.out.ptintln("调用Other()");
    }
}

在这个例子中,new Other()时,首先执行了super(10),表示调用构造函数时传入int数值10,也就是调用父类中Some(int i)版本的构造函数,而后再继续执行Other()中super(10)之后的流程。


重点来了,其实当你这么撰写时:

    class Some{
        Some(){
            System.out.println("调用Some()");
        }
    }
    class Other extends Some{
        Other (){
            System.out.ptintln("调用Other()");
        }
    }

前面谈过,如果子类的构造函数中没有指定调用父类的哪一个构造函数,那么默认调用父类的无参构造函数,也就相当于你这么写:

    class Some{
        Some(){
            System.out.println("调用Some()");
        }
    }
    class Other extends Some{
        Other (){
            super();    //super()默认省略。
            System.out.ptintln("调用Other()");
        }
    }


注意:
this()与super()只能择一调用,并且一定要在构造函数的第一行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章