欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java继承中的构造方法

程序员文章站 2022-05-14 11:54:31
...

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
	}
}

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

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

相关标签: 构造方法