Java继承疑问:子类未传参时父类为何不能用带参构造器?
原因解析
这是Java编译器的默认构造器生成规则在起作用,核心逻辑分两点:
- 当类没有显式定义任何构造器时,Java编译器会自动为该类生成一个无参的默认构造器,这个构造器内部只会调用父类的无参构造器(
super())。 - 当类显式定义了任意构造器(不管是带参还是无参),编译器就不会再自动生成无参构造器。
结合你给出的两段代码具体分析:
第一段报错代码
class a{ a(int age){} } class b extends a{} public class HelloWorld { public static void main(String[] args) { b var1=new b(); System.out.println("Try programiz.pro"); } }
父类a显式定义了带参构造器,因此编译器不会为它生成无参构造器。子类b没写构造器,编译器会自动为b生成默认构造器,这个默认构造器里会默认调用super()(父类的无参构造器),但父类a根本不存在这个构造器,所以编译报错。添加super(10)后,就是显式调用父类的带参构造器,自然能正常运行。
第二段正常运行代码
class a{} class b extends a{} public class HelloWorld { public static void main(String[] args) { b var1=new b(); System.out.println("Try programiz.pro"); } }
父类a没有显式定义任何构造器,编译器自动为它生成了一个无参构造器a() {}。子类b的默认构造器调用这个父类的无参构造器,所以实例化过程完全正常。
内容的提问来源于stack exchange,提问作者anant
相关产品推荐
相关产品推荐

