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

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();
	}
}

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


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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值