你要记住,实例化子类时,调用子类的构造方法初始化时,是要先调用父类的构造方法进行初始化。
你的示例里父类是无参构造方法,子类其实隐含调用了 super(); 这个语句在子类构造方法的第一句,可以省略,编译成class会自动添加上去。
这就是为啥先打印父类构造函数的内容的原因。
根据参考资料,该问题并没有直接和第一个代码段中的性能问题相关,而是为什么在调用new A(3)时会调用无参构造方法。对于这个问题,我需要看一下代码才能确定原因。如果A是一个类,那么可以考虑以下几种情况:
A类中重写了无参构造方法并删去了有参构造方法。这种情况是很有可能出现的,因为无参构造方法是默认提供的,如果创建了一个新的构造方法没有同时保留无参构造方法,就会调用父类的无参构造方法。
在创建A的子类时,没有显示地调用父类的有参构造方法。这种情况下,执行子类的构造方法时,就不会去调用父类构造方法,即使父类只有一个有参构造方法。所以在调用new A(3)时,虽然有A的有参构造方法,但它的实现是要调用父类的有参构造方法的,如果子类没有显示地去调用这个父类构造方法,就只能执行父类的无参构造方法。
针对上述两种可能的原因,我们可以尝试去调整代码来避免这个问题,比如在父类A中保留默认的无参构造方法,或是在子类中加上super()语句来显示地调用父类构造方法。如果调整过后还有问题,再看看是不是其他方面的原因导致的。