上一篇:青出于蓝-了不起的继承类 | 带你学《Java面向对象编程》之三十六
【本节目标】
通过阅读本节内容,你将了解到继承类实例化的秘密,并能够通过一定的逻辑在父子类中实现简单的开发。
子类对象实例化流程
现在已经成功实现了继承关系,并且也已经发现了继承主要特点,但是一旦程序之中提供有继承逻辑,那么对与子类对象的实例化定义是有要求的。从正常的社会逻辑来讲:没有父亲一定没有孩子。对于继承程序的逻辑也是一样的,在进行子类对象实例化的时候一定要首先实例化好父类对象。
范例:观察一个程序
class Person {
public Person() {
System.out.println(“【Person父类】一个新的Person父类实例化对象产生了。”) ;
}
}
class Student extends Person { //student是子类
public student() {} //构造方法
System.out.println(“【Student子类】一个新的Student实例化对象产生了。”) ;
}
public class JavaDemo{
public static void main(String args[]) {
new Student() ; //实例化子类对象
}
}
程序执行结果:
【Person父类】一个新的Person父类实例化对象产生了。
【Student子类】一个新的Student实例化对象产生了。
现在即使没有进行父类对象实例化,也会由系统自动调用父类的构造方法(实例化父类对象),默认情况下的子类对象实例化流程会自动实例化父类对象。实际上就相当于子类的构造方法里面隐含了一个“super()”的形式。
范例:修改子类定义
class Student extends Person { //student是子类
public student() {} //构造方法
super() ; //写与不写此语句效果一样
System.out.println(“【Student子类】一个新的Student实例化对象产生了。”) ;
}
super()表示的就是子类调用父类构造的语句,该语句只允许放在子类构造方法的首行。在默认情况下的实例化处理,子类只会调用父类中的无参构造方法,所以写与不写“super()”区别不大,但是如果父类中没有提供无参构造,这时就必须利用super()明确调用有参构造。
class Person {
private String name ;
private int age ;
public Person(String name ,int age) {
this.name = name ;
this.age = age ;
}
}
class Student extends Person { //student是子类
private String school ;
public student(String name , int age ,String school) { //构造方法
super(name ,age) ; //明确调用父类构造
this.school = school ;
}
}
public class JavaDemo{
public static void main(String args[]) {
new Student(“林小强”, 48 ,”北京大学”) ; //实例化子类对象
}
}
结论:无论怎样,在实例化子类对象的同时一定会实例化父类对象,目的是对了所有的属性可以进行空间分配。
super与this都可以调用构造方法,super是由子类调用父类的构造,而this是调用本类构造,并且都一定要放在构造方法的首行,所以两个语句不允许同时出现。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学