从一个小例题学习super()函数的特点

题目如下:写出程序运行结果

class Super
{
	int i=0;
	public Super(String a)
	{
		System.out.println("A");
		i=1;
	}
	public Super()
	{
		System.out.println("B");
		i+=2;
	}
}

class  Demo extends Super
{
	public Demo(String a)
	{
		System.out.println("C");
		i+=5;
	}
	public static void main(String[] args) 
	{
		int i=4;
		Super d=new Demo("A");
		System.out.println(d.i);
	}
}

运行结果:B C 7

解析:Super d=new Demo("A");时,会调用demo的有参构造函数,而构造函数第一行有个super()【隐式的,下面会解释】,于是就到父类中,此时i为0,执行父类的无参构造函数

public Super()
{
System.out.println("B");
i+=2;
}
,此时打印B且i为2;执行完之后再回到demo的构造函数

public Demo(String a)
{
System.out.println("C");
i+=5;
}
继续执行,打印C此时i为7.

那么为什么在demo构造函数第一行会有隐式的super函数呢?

是这样的,1.当父类中有个空参数的构造函数时候,子类所有的构成函数里第一行默认都有一句supr():调用父类的空参数构成函数;所以子类初始化时候,要先访问下父类构造函数,如果要访问父类指定的构造函数,可以手动定义super语句,子类中至少有个构造函数会访问父类构造函数;

2.当父类中没空参数的构造函数时候,而是有参数的父类构造函数。这时super()不能隐式。则必须自己在子类的构成函数里第一行默认添加super(参数)

猜你喜欢

转载自blog.csdn.net/weixin_41113108/article/details/80426321