/*定义父类Base1*/
public class Base1 {

	int a;// 定义一个变量

	/* 父类构造方法 */

	public Base1(int a) {
		this.a = a;
		System.out.println("调用了父类的有参构造方法!");
	}

	public Base1() {
		a = 1;
		System.out.println("调用了父类的无参构造方法!!");
		;
	}

	public static void main(String[] args) {
		Son1 s1 = new Son1();// 利用子类的无参构造方法创建子类对象s1
		Son1 s2 = new Son1(3, 4);// 利用子类的有两个参数的构造方法创建子类对象s2
		Son1 s3 = new Son1(5);// // 利用子类的有一个参数的构造方法创建子类对象s3
		s1.print();
		s2.print();
		s3.print();

	}
}

/* 定义子类Son1*/
class Son1 extends Base1 {
	private int b;

	/* 子类类构造方法 */
	public Son1() {
		b = 2;
		System.out.println("调用了子类的无参构造方法!!");
	}

	public Son1(int a, int b) {
		super(a);
		this.b = b;
		System.out.println("调用了子类的有两个参数的构造方法!");
	}

	public Son1(int b) {
		this.b = b;
		System.out.println("调用了子类的有一个参构造方法!");
	}

	public void print() {
		System.out.println("a: " + a + ",b:" + b);
	}
}


输出结果如下:

调用了父类的无参构造方法!!
调用了子类的无参构造方法!!
调用了父类的有参构造方法!
调用了子类的有两个参数的构造方法!
调用了父类的无参构造方法!!
调用了子类的有一个参构造方法!
a: 1,b:2
a: 3,b:4
a: 1,b:5


由此可以得出结论:子类对象在实例化时会默认先去调用父类中的相应的构造方法,之后再调用子类中的相应构造方法。