Java继承中父类和子类构造函数的问题

Java子类继承父类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数,可以参考这篇Java子类实例化总是调用父类的无参构造方法
1、当父类没有显式定义构造方法时,编辑器会默认为此类添加一个隐式无参构造函数。此时子类可以有自己的无参和有参构造方法。
2、当父类有显是定义无参构造方法时,此时子类也可以有自己的无参和有参构造方法。
3、当父类只有显式定义有参构造方法时,此时子类定义无参方法会出错:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即隐式父类构造函数Father()未定义, 必须显式调用另一个构造函数,当此时调用父类的有参构造函数时,使用super(i),这里i是参数,会提示i没有定义,因为此时是无参构造函数;在子类的有参构造函数中使用super(i)调用父类的有参构造函数不会出错。
分析:默认都是调用父类的无参构造函数,当父类有有参构造函数时,编辑器不会为父类添加无参的构造函数,在子类继承父类时,本来是默认在构造函数第一行都是默认有使用super()调用父类无参构造函数的,现在父类没有无参构造函数,因此提示显示调用另一个构造函数(即有参构造函数)。
提醒一点,当没有子类继承父类时,父类只定义有参构造函数是没有问题的。
4、当父类和子类都有无参和有参构造方法时,默认是子类构造方法都是调用父类的无参构造方法的,但当子类的有参构造方法使用super(i)调用父类的有参构造方法时,带参数实例化时就不再调用父类的无参构造方法,而是调用父类的有参构造方法,因为是显示调用(人为强制的)。
1的示例:

package classTest;

class Father1{

}
class Son1 extends Father1{
	public Son1() {
		System.out.println("子类的无参构造方法");
	}
	public Son1(int i) {

		System.out.println("子类中有参构造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
}
}

运行结果:

子类的无参构造方法

2中的示例:

package classTest;


class Father1{
	public Father1() {		
	}
}
class Son1 extends Father1{
	public Son1() {
		System.out.println("子类的无参构造方法");
	}
	public Son1(int i) {
		System.out.println("子类中有参构造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
}
}

运行结果:

子类的无参构造方法

3中的示例:

package classTest;


class Father1{

	  public Father1(int i) {
		System.out.println("父类中的有参构造方法"+i);
	}
}
class Son1 extends Father1{

	public Son1() {
		super(i);
		System.out.println("子类的无参构造方法");
	}
	public Son1(int i) {
         super(i);
		System.out.println("子类中有参构造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
}
}

结果:显示参数没有定义

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	i cannot be resolved to a variable

4中的实例:

package classTest;


class Father1{
    public Father1() {
	System.out.println("父类的无参构造方法");
}
	  public Father1(int i) {
		System.out.println("父类中的有参构造方法"+i);
	}
}
class Son1 extends Father1{

	public Son1() {
		System.out.println("子类的无参构造方法");
	}
	public Son1(int i) {
         super(i);
		System.out.println("子类中有参构造方法"+i);
	}
}
public class TestExtend {
public static void main(String[] args) {
	Son1 s = new Son1();
	System.out.println("-----");
	Son1 a = new Son1(5);
}
}

结果:

父类的无参构造方法
子类的无参构造方法
-----
父类中的有参构造方法5
子类中有参构造方法5

猜你喜欢

转载自blog.csdn.net/qq_33699659/article/details/84865699