
1 oldshensheep 2021-04-22 22:17:09 +08:00 不是很明白问题是什么意思,子类构造函数如果没有用 super,那就是调用父类的无参构造函数。 如果你父类写了构造函数,就不会自动生成无参构造函数了。 |
2 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 } 有请下一位同学告诉楼主为什么 |
3 Rocketer 2021-04-23 01:02:12 +08:00 via iPhone 第一位同学的最后一句已经回答过为什么了 |
4 passerbytiny 2021-04-23 09:36:05 +08:00 via Android 一、Java 的类加载机制是,必须先构造基类再构造子类,所以构造器第一句必定是 super() 或 super(args... ) ,你要自己没写编译器就给你自动加上 suoer() 。 二、只在你没定义构造器的时候才自动添加无参构造器如果你只添加了带参构造器,通常表示你不允许无参构造而只允许带参构造,这时候编译器是不能自作聪明给加上无参构造的。 以上两点造成了,如果基类定义了无参构造器并且未添加无参构造,那么子类的构造器都得明确调用 super(args...) 。上述情况不表示你必须为类添加一个无参构造,因为上述情况在某些场景下是正确而非错误情况。 |
6 ESP OP @oldshensheep 感谢回复。如果子类构造函数没有用 super,既然编译器会为父类自动添加无参构造函数,那为什么父类还要显式地提供无参构造函数呢? |
7 ESP OP @passerbytiny 感谢解答 |
8 neptuno 2021-06-11 15:30:39 +08:00 父类不需要显式提供无参构造函数呀,不定义任何构造函数的时候,编译器会给你加上无参构造函数;如果你提供了某个构造函数,编译器不会给你加无参构造函数; |