在学习的过程中,有很多学生对super及this关键字老是分不清,或者是不知道怎么去用,特别是在构造器之中,更是迷惑。我在这里主要针对学生上课中遇到的一点问题加以介绍,希望对大家学习有所帮助。
首先,我们先看下面一个例子:
这个例子非常简单,有一个子类Child继承于父类Father,然后在测试类Test中使用子类引用。调用子类中的fun方法,执行结果和我们预料的一样:
我们知道,使用new操作符,我们会调用类中相应的构造器,所以,在执行"Child c = new Child(); "这条语句时,我们应该去调用子类中无参的构造器,但是在子类Child中貌似没有构造器。这时大家要注意了,其实我们每个类中,实际上是有一个无参的构造器的。但是,如果程序员自定义了构造器,这时我们只能使用自己的构造器。所以,这时也不难理解,为什么我们new子类实例,是没有报错的了!所以,我们添上一个无参构造器,结果也是一样的。
说到这里,有些同学会问,父类中是否也有默认的无参构造器呢?答案是肯定的!
细心的同学这时会发现,为什么父类中的构造器先于子类的构造器执行呢?我经常会给学生这样解释"老子都没有,哪来的儿子",虽然这句话比较粗俗,但是一语道出了真谛。子类继承父类,父类都不存在,子类谈何继承?但这只是我们逻辑上的理解,java语言怎么解释的呢?这时就有了我们的主角:this,super。
this代表本类引用,super代表父类引用,构造器中亦是如此。看实例:
这是不是一目了然啊?原来在子类构造器中隐藏着一个super(),它就代表父类中的无参构造器!