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

Java类继承构造函数顺序依赖

程序员文章站 2022-05-14 09:06:09
...

Java在类继承时,创建子类对象时,执行顺序如下:

1. 对子类所有域分配内存并初始化默认值(包括从父类继承的),然后执行构造函数(如果未定义,则执行默认无参构造函数)

2. 每个构造函数执行都会经过三个阶段(注意这是一个类似递归的过程):

    2.1 显式调用(super)父类的构造函数或者隐式调用父类的无参构造函数。如果是显示调用this构造函数,则这种调用链会一直执行到遇到某个显式或者隐式的父类构造函数调用为止

    2.2 利用初始器或者任何初始化语句块对域进行初始化

    2.3 执行构造函数体

下面看个例子:

A.java:

package study;


public class A {
	A()
	{
		System.out.println("A()");
		this.testpublic();
		this.testprivate();
	}
	A(int i)
	{
		System.out.println("A("+i+")");
		testpublic();
	}
	public void testpublic()
	{
		System.out.println("A.testpublic()");
	}
	private void testprivate()
	{
		System.out.println("A.testprivate()");
	}
}

B.java

package study;


public class B extends A {
	B(){
		this(4);
		System.out.println("B()");
	}
	B(int i)
	{
		System.out.println("B("+i+")");
	}
	public void testpublic()
	{
		System.out.println("B.testpublic()");
	}
	public void testprivate()
	{
		System.out.println("B.testprivate()");
	}
}

Main.java

package study;

public class Main {
	public static void main(String argv[])
	{
		A b = new B();
		b.testpublic();
	}
}

可以先自己思考下运行结果会是怎样,下面这里给出程序运行结果:

Java类继承构造函数顺序依赖

B()->B(4)->A()->B(4)->B()

我们可以看到这是一个类似递归的过程,其实这里面还忽略了A()的执行阶段,A是默认从Object类继承来的,也就是说,A的构造函数还会继续递归调用父类Object的构造函数,直到*类。

我们还看到了Java多态性在构造函数期的性质。注意public和private在此的区别,至于具体的原因我还未理清,如有大神知晓,还望指点!