继承——子类实例化过程的细节

1. 如果子类的构造函数第一行写了this()调用了本类其他构造函数,那么super调用父类的语句就没有了。因为this()或者super()只能定义在构造函数的第一行,因为初始化动作要先执行。

public class Fu {	
	Fu()
    {
		System.out.println("Fu的无参构造函数");
    }
}


public class zi extends Fu {
	zi()
	{
		System.out.println("zi 的无参构造函数");
	}
	zi(int x)
	{
		this();
		System.out.println("zi 的有参构造函数");
	}
}


public class test {
	public static void main(String[] args) {
		zi z=new zi(3);
	}
}


结果:Fu的无参构造函数
      zi 的无参构造函数
      zi 的有参构造函数

上面这个例子,虽然有this(),那么该构造函数里就没有super()了,但是this()调用了zi的无参构造函数,这个函数里是有super()的,反正保证了至少有一个子类有隐式super()。

2.

问题:子类构造函数有super(),那么父类构造函数里有没有隐式的super()呢?

答案:有。只要是构造函数默认第一行都是super()。

问题:父类的父类是什么呢?父类默认的super()调用的是谁的构造函数呢?

答案:Java体现在设计时,定义了一个所有对象的父类Object。

总结:

类中的构造函数默认第一行都有隐式的super()语句,用来访问父类的构造函数。

所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。

如果默认的隐式super()语句没有对应的构造函数,必须在构造函数中通过this或者super的形式声明调用的构造函数。

发布了30 篇原创文章 · 获赞 6 · 访问量 936

猜你喜欢

转载自blog.csdn.net/weixin_43677405/article/details/104082783