什么是super?
是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
如果没有super存在的问题:
继承中子类可能会重写父类的方法,子类属性可能覆盖父类属性,在此情况下,如何通过子类得到父类属性或方法呢?
public class Super {
public static void main(String[] args){
new Child().f(); //打印:30 18
}
}
class Father{
public int age=30;
public void f(){
System.out.println(age);
}
}
class Child extends Father{
public int age=18;
public void f(){
super.f();
System.out.println(age);
}
}
可以发现:super直接指向了父类,因此不用担心无法得到父类中被子类覆盖的值或方法。
这里还想强调一点:子类所有构造方法默认调用super(),即默认调用父类构造器。
class A{
public A(){
System.out.println("构造了A");
}
}
class b extends A{
public b(){
super(); //可写.可不写,默认就有
System.out.println("构造了b");
}
}
public class Super {
public static void main(String[] args){
new b(); //打印:A b
}
}
注意:super()中也可以向父类传递参数,传递给构造器的参数,用于父类的初始化。
练习(易错):
由此提出一个问题:上述代码new b()创建了几个对象?
答案:3个,先创建Object()基类-->再创建A类-->再创建b类。