Java继承中的构造方法

Java继承当中,子类中所有的构造方法默认都会访问父类的空参构造,看一个例子:

class Demo02_SuperTest {
	public static void main(String[] args) {
		Son s = new Son(10); 
		System.out.println("Son age:" + s.age);
	}
}

class Father{
	int age;

	static {
		System.out.println("父类的静态代码块");//1 静态代码块先于构造代码块执行
	}

	{
		System.out.println("父类的构造代码块");//3
	}

	Father () {
		System.out.println("父类的无参数构造方法");//4
	}

	Father (int age) {
		this.age = age;
		System.out.println("父类的有参数构造方法");
	}
}

class Son extends Father{
	static {
		System.out.println("子类的静态代码块");//2
	}

	{
		System.out.println("子类的构造代码块");//5
	}

	Son () {
		System.out.println("子类的无参数构造方法");
	}

	Son (int age) {
		this.age = age;
		System.out.println("子类的有参数构造方法");//6
	}
}

其中,静态代码块都会先于其他代码执行,并且先执行父类的静态代码块。

执行完静态代码块之后,会执行构造代码块,但是此时会先把父类中构造代码块和构造方法执行完之后才会执行子类的构造代码块和构造方法。

但是为什么明明Son s = new Son(10);却用了父类的无参数构造方法呢?因为如果在子类的构造方法Son () {}中,没有显式调用其他构造方法,就会默认访问父类的空参构造,即Son () {super();}。

那么如果想要调用父类的有参构造,就可以在子类的构造方法中显式访问其他构造方法。例如:

class Demo02_SuperTest {
	public static void main(String[] args) {
		Son s = new Son();
		System.out.println("Son age:" + s.age);
	}
}

class Father{
	int age;

	static {
		System.out.println("父类的静态代码块");//1
	}

	{
		System.out.println("父类的构造代码块");//3
	}

	Father () {
		System.out.println("父类的无参数构造方法");//调用有参构造方法后不会再调用
	}

	Father (int age) {
		this.age = age;
		System.out.println("父类的有参数构造方法");
	}
}

class Son extends Father{
	static {
		System.out.println("子类的静态代码块");//2
	}

	{
		System.out.println("子类的构造代码块");//5
	}

	Son () {
		//super(10)代表显式调用Father (int age)
		super(10);//Son s = new Son();子类有参构造方法,不会再调用父类无参构造方法
		System.out.println("子类的无参数构造方法");
	}

	Son (int age) {
		this.age = age;
		System.out.println("子类的有参数构造方法");//6
	}
}

总结:无论如何解决,都一定要访问到父类的构造方法。

原因:在给子类进行初始化之前,必须要父类的所有数据都准备好,因为有可能在子类初始化的过程中,要使用父类部分的数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值