[疑问] 既然编译器会为自动为类添加无参构造函数,那么为什么父类还需要一个无参构造方法以供子类调用?(如果子类没有使用 super 调用)

2021-04-22 21:32:45 +08:00
 ESP
The title says it all.
2037 次点击
所在节点    Java
8 条回复
oldshensheep
2021-04-22 22:17:09 +08:00
不是很明白问题是什么意思,子类构造函数如果没有用 super,那就是调用父类的无参构造函数。
如果你父类写了构造函数,就不会自动生成无参构造函数了。
Kasumi20
2021-04-22 22:59:53 +08:00
我虽然同样读不懂楼主在说什么。
但是。
我猜。
他是说:
7 class CC {
8 public CC() {} <----------------- 此处必须显式提供该构造方法
9 public CC(int a) {}
10 }
11
12 class BB extends CC {
13 public BB() {
14 System.out.println("OK");
15 }
16 }

有请下一位同学告诉楼主为什么
Rocketer
2021-04-23 01:02:12 +08:00
第一位同学的最后一句已经回答过为什么了
passerbytiny
2021-04-23 09:36:05 +08:00
一、Java 的类加载机制是,必须先构造基类再构造子类,所以构造器第一句必定是 super() 或 super(args... ) ,你要自己没写编译器就给你自动加上 suoer() 。
二、只在你没定义构造器的时候才自动添加无参构造器——如果你只添加了带参构造器,通常表示你不允许无参构造而只允许带参构造,这时候编译器是不能自作聪明给加上无参构造的。

以上两点造成了,如果基类定义了无参构造器并且未添加无参构造,那么子类的构造器都得明确调用 super(args...) 。上述情况不表示你必须为类添加一个无参构造,因为上述情况在某些场景下是正确而非错误情况。
ESP
2021-04-23 14:09:04 +08:00
@Kasumi20 是这个意思,感谢回答
ESP
2021-04-23 14:10:48 +08:00
@oldshensheep 感谢回复。如果子类构造函数没有用 super,既然编译器会为父类自动添加无参构造函数,那为什么父类还要显式地提供无参构造函数呢?
ESP
2021-04-23 14:20:29 +08:00
@passerbytiny 感谢解答
neptuno
2021-06-11 15:30:39 +08:00
父类不需要显式提供无参构造函数呀,不定义任何构造函数的时候,编译器会给你加上无参构造函数;如果你提供了某个构造函数,编译器不会给你加无参构造函数;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/772559

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX