在Java中一个类中有一个默认的无参构造方法,只有访问控制符修饰方法名与类名相同。而在继承中,子类的默认无参构造方法是受到父类影响的。
a、super()调用父类构造方法,该语句必须位于有效代码行的第一行
b、如果一个构造方法没有调用本类中的其他构造方法,则默认有一个super();反之没有super()
下面用代码实例证明:
/*定义父类 */ public class Father { public Father() { super();//默认调用Object类构造方法 System.out.println("父类构造方法"); } } /*定义子类 */ public class Son extends Father{ public Son() { super();//默认调用父类的无参构造方法 } public static void main(String[] args) { new Son(); } }观察结果,子类调用父类无参构造方法
改写子类代码,在子类中再定义一个有参构造方法,在子类原先的无参构造方法中调用该有参构造方法:
/*定义父类 */ public class Father { public Father() { super();//默认调用Object类构造方法 System.out.println("父类构造方法"); } } public class Son extends Father{ public Son() { this(12); //调用本类其他构造方法 } public Son(int a) { //新有参构造方法 } public static void main(String[] args) { new Son(); } }
有结果可知,结果语句只输出了一遍,说明原子类无参构造方法中默认调用的父类的无参构造方法自动取消。
=============================================================================
到这里问题来了,目前我们定义的父类中只有默认的无参构造方法,如果我们在定义一个有参构造方法呢?
改写父类代码,保持起初的子类代码不变,并加入有参构造方法:
public class Father { public Father() { super(); //默认调用Object类构造方法 System.out.println("父类无参构造方法"); } public Father(int a) { //有参构造方法 System.out.println("父类有参构造方法"); } } /*定义子类 */ public class Son extends Father{ public Son() { super();//默认调用父类的无参构造方法 } public static void main(String[] args) { new Son(); } }运行结果不变,这就涉及到Java的重载,因为 子类内不得super()内不含参数,所以调用无参构造方法。
上述的代码示例中,父类中始终有一个无参构造方法,那么如果我们把无参构造方法删除,只创建有参构造方法呢?
首先,因为把无参构造方法删除后只创建有参构造方法,父类原来默认的无参构造方法自动取消,而又因为子类构造方法默认调用父类无参构造方法,而此时父类默认无参构造方法已经消失,因此自类构造方法的方法体如果为空,编译器会报错。
所以此时我们就必须在子类构造方法体内输入语句调用父类有参构造方法:
结果如图示
总结上述内容就一句话:子类构造方法必须调用父类构造方法。