1,子类实例化时只会调用一次父类的构造函数,这是语言规范;
2,你只能在子类构造函数中调用父类构造函数;
3,super() 表示显示调用父类的构造函数,该方法主要是用于调用有参的父类构造函数,如果父类具有无参的构造函数,编译器会自动调用该无参构造函数,而不用你使用 super() 语句显示调用;
因为你显示调用了父类的无参构造 super(); 当显示调用无参构造函数时 该函数执行一次
class A {
A() {
System.out.printf("A\n");
}
}
class B extends A {
B() {
System.out.printf("B\n");
}
}
若不使用 super(); 显示调用的话 结果也是一样的
super(),没看到这个方法。
你在初始化B b=new B();
执行顺序是:先初始化基类A的构造函数,然后再执行B的构造函数。当然就执行
System.out.printf("A\n");然后
System.out.printf("B\n");
初始化的时候,已经调用了基类的构造函数,不加super也可以。
在new一个子类的时候,在调用子类的构造方法前需要先去调用父类的构造方法(很容易理解,就像生活中必须先有父亲再有儿子),默认情况下如果你不显式调用父类构造方法的话,编译器会也会自动生成一个super()来调用父类的无参构造方法,你显式调用的话,那编译器就不会生成默认的super()了!
所以先调用父类的构造方法输出 A
再调用子类的构造方法输出 B
继承自父类,当调用构造方法时,加不加super()效果都是一样的