1、为什么要super?
① 子类在继承父类以后,并对父类的方法进行了重写,这时在子类中,想要调用父类中被重写的方法,就可以使用super。
② 子类在继承父类以后,如果定义了同名的属性,这时在子类中,想要调用父类中同名的属性,就可以使用super。
2、super可以调用的结构:
属性,方法,构造器
public class Father(){ Strng str; int num; public Father(){ } public Father(String sr, int num){ this.str = str; this.num = num; } } class Son extends Father (){ String str; int num; public Son(){ super();//可以省略,默认存在,调用Father类的空参构造器 } public Son(String str, int num){ super(str,num)//使用super调用Father类的(str,num)构造器 } } class SonTest{ public static void main(String args[]){ Son s = new Son("Tom",12); } }
super调用属性,方法
子类在继承父类以后,我们就可以在子类的方法或构造器中,调用父类的属性或方法。(满足封装的前提)。一般情况下,我们可以考虑省略"super."的结构。但是如果出现子类重写了父类的方法 或 子父类中出现了同名的属性,则必须调用super的声明,显示调用的是父类的属性或方法。
super调用构造器
① 子类继承父类时,不会继承父类的构造器。只能通过“super(形参列表)"的方式调用父类指定的构造器。
② 规定:“super(形参列表)”,必须声明在构造器的首行。
③ 在构造器的首行 "this(形参列表)" 和 "super(形参列表)" 只能二选一。
④ 如果在子类构造器的首行既没有显示调用"this(形参列表)",也没有显示调用"super(形参列表)",则子类构造器会默认调用"super(形参列表)"。
⑤ 一个类中声明有n个构造器,那么最多有n-1个构造器中使用了"this(形参列表)",剩下的那个一定使用了"super(形参列表)"。
问题:在创建子类对象的过程中,一定会调用父类的构造器吗?
yes!!
问题: 创建子类的对象时,内存中有几个对象?
只有一个对象,就是new后面构造器对应的类的对象。