今天在做项目的时候,发现了子类与父类之间构造器的调用问题。代码如下:
SuperClass.java
package constructor; public class SuperClass { public SuperClass(String name) { System.out.println("SuperClass" + name); } }
SubClass.java
package constructor; public class SubClass extends SuperClass{ public SubClass() { System.out.println("no-argument SubClass" ); } }
这样一来,在SubClass.java的构造器中就会报错。在子类构造器中,如果没有显式调用父类的构造器,那么编译器会就会自动隐式地给子类构造器添加父类的默认无参构造器(default no-argument constructor)。如果此时父类中已经定义好了无参构造器或者没有构造器,那么子类就不会出现问题。但是,如果父类定义了有参构造器(so编译器不会给父类隐式添加无参构造器),而在子类构造器中又没有显示的调用父类的定义的构造器,子类的构造器就会报错:Implicit super constructor SuperClass() is undefined for default constructor. Must define an explicit constructor。原因就是因为编译器没有找到它期望的那个父类构造器。所以,有三种方法解决这个问题:
1 在父类中显式定义一个无参构造器;
2 在子类构造器中,显式地调用父类带参构造器,即在子类构造器中的第一行写入super(String str)<必须是第一行,这和类的初始化顺序有关>;
3 注释掉或者删掉父类中的带参构造器,这种做法其实是这样的:当编译器发现一个类没有构造器时,就会隐式添加一个默认无参构造器。
原文地址:http://blog.163.com/yu_chao2013/blog/static/23389316820145251040692/?newFollowBlog点击打开链接