java温习*(6):关于super的常见问题

1、子类构造默认调用父类无参构造方法,那么如果父类中没有无参的构造方法只有有参的构造方法,一定会编译报错吗?编译报错是否就代表无法正常运行?

答案是:此时一定会编译报错,但不一定会无法正常运行,需要看具体编码情况。

下面我们结合示例来看一下:譬如设定自定义类:Paternal、Modern为继承关系,且满足父类中只有带参构造方法。定义Test类为测试类,完成Modern对象构建。

Ps:此处由于展示篇幅有限,暂不考虑属性的访问权限

  • 子类中没有任何构造方法中通过super调用父类指定带参构造

java温习*(6):关于super的常见问题

java温习*(6):关于super的常见问题

此时能明显看出,两个编译错误提示,具体信息为:由于父类没有无参构造,因此需要调用其他构造方法。

java温习*(6):关于super的常见问题

测试类为:

java温习*(6):关于super的常见问题

运行结果,产生异常,原因为:父类没有无参构造,因此必须调用其他构造方法,否则无法完成指定对象创建。

java温习*(6):关于super的常见问题

由此可见,当父类中只有带参构造,子类中没有任何构造方法中通过super调用父类指定带参构造得时候,一定会编译报错,同时也会产生运行异常。

  • 子类中部分构造方法通过super调用了父类指定的带参构造

修改子类带参构造,使用super调用父类对应构造,无参构造不动

java温习*(6):关于super的常见问题

此时错误提示仍为:由于父类没有无参构造,因此需要调用其他构造方法。

java温习*(6):关于super的常见问题

测试类不变,则运行结果为

java温习*(6):关于super的常见问题

如,调整测试类为:

java温习*(6):关于super的常见问题

运行结果,产生异常,原因为:父类没有无参构造,因此必须调用其他构造方法,否则无法完成指定对象创建。

java温习*(6):关于super的常见问题

由此可见,当父类中只有带参构造,子类中如只有部分构造方法通过super调用父类指定带参构造得时候,依然会产生编译异常;但此时,如在测试类中,调用的是已经处理过的子类构造则不会产生运行时异常(Ps:处理指应用super调用过指定父类构造)。

简单来说,可以理解为,编译出错只是提醒代码有漏洞,但是运行时如果不执行漏洞代码,则不影响正常的运行结果。

2、如果子类通过super来调用父类的带参构造,那么是不是父类当中就可以不需要定义无参构造了?

如果只是考虑当前功能实现,的确可以不在父类中定义无参构造方法了;但是如果考虑到后续功能扩展,还是建议大家在父类中保留无参构造的编码。

3、请问如果子类构造方法调用了this(),那么还会默认调用父类的super()吗?

答案是:肯定会。

因为,当子类的带参构造方法调用this(),意思是,调用了同类中的无参构造方法,
而在子类的无参构造方法中如果没有通过super设定,则默认会调用其父类的无参构造方法,也就是编译器会自动在子类无参构造方法中添加super()。

下面我们结合示例来看一下:譬如设定自定义类:Paternal、Modern为继承关系,且满足父类中只有带参构造方法。定义Test类为测试类,完成Modern对象构建。

Ps:此处由于展示篇幅有限,暂不考虑属性的访问权限

java温习*(6):关于super的常见问题

java温习*(6):关于super的常见问题

java温习*(6):关于super的常见问题

运行结果为:

java温习*(6):关于super的常见问题

  • this和super不能再静态方法中使用
  • this和super不能共存