JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-细节
一.
现在要思考一下,为什么要有super(),为什么要访问父类。
对于截图中的问题,进一步地扩展就是为什么要有子类的实例化?
子类继承了父类以后,就产生了关系,就具备了父类的一些属性和行为。
举个例子:
截图中,父类里面定义了一些属性,并且用构造函数对属性进行了初始化。如果子类不访问父类,如果子类new对象的时候,只调用自己的,不访问父类的构造函数的时候,那么子类拿到的num值是0(首先,子类继承了父类的属性,接着属性没有经过父类的初始化的构造函数,最后结果为0)。这个就不合适了,因为父类本身对自己的属性进行了初始化,所以子类在拿父类东西的时候,先看看父类是如何对它自己的东西进行初始化的。你初始化结束了,我直接拿来就用。所以访问父类构造函数就变成了必须。
在子类进行初始化的时候,子类对象在内存空间一建立,父类的num和子类的num都会在内存空间中展现出来。那么它知道父类如何对num进行初始化的。
你拿人家东西,是不是先要看下,人家如何对自己的东西进行初始化的。这就是为什么子类必须访问父类构造函数的原因。
为了完成这个必须的动作,就在子类的构造函数中加入了super(),语句。
实例化过程的核心是super(),为什么会有实例化的出现?这个问题来源于,在子父类之间继承的基础上,利用子类创建了对象,在创建对象时要初始化。由于是继承关系,光子类初始化肯定不行,还必须有父类的初始化。这就解释了为什么会有子类的实例化过程和super()的存在。而且,super()语句可以直接定向化父类的哪一个构造函数的初始化。
这里出现一个小插曲,冲突也就随之而来。
以前在学习时,描述类中有this()的存在,不看父类的化,这样写是正确的。this()是在调用本类的Zi()构造函数初始化,现在问Zi(int x)构造函数内有super()么?
以前this()是要放在第一行,现在讲到继承,super()也要放在第一行,那这是不是有冲突?
正确的说法就是,这里面没有super()。但是没有了super(),那么继承父类还有什么意义呢?
仔细看下面的截图,流程是这样的:先是new Zi(6),在新建对象时,要初始化。调用了Zi(int x),在这个构造函数里,第一句是this(),而且是没有super()语句的。由于this()的关系,在Zi(int x)初始化之前,我们先调用本类空参数的初始化,在Zi()的构造函数中,第一句就是super()。
肯定有一个访问父类的,至少有一个,没有super()初始化不了。子类初始化没有父类的帮助,是不行的。
看上面的截图,如果Zi()中有this(3),那它就没有super()语句了,只有this(3),好像子类中两个构造函数都没有super()语句。实际上,这么写是有问题的。新建对象时,调用Zi(int x)函数,Zi(int x)函数中执行this(),又调用Zi()初始化,Zi()中接着执行this(3),也就是回过头来调用Zi(int x)函数,这样就陷入了一个死循环。
这里有个问题,为什么Zi()中有this(3),就没有super()语句了?难道说this()和super()只能有一个位于句首、
对于以继承关系发展起来的子父类,任何一个类中都会有下面截图中的隐式句子,隐式的默认函数,函数中有隐式的super()语句和renturn返回语句。
构造函数也带着权限,如果类前面有public,即public class Demo{},那么构造函数里面也有public。类公有了,其构造函数也得公有出去。如果类没有public,那么里面也不需要public。
上面的截图中,有一个小疑问,Demo类没有继承,里面的构造函数哪来的super()语句呢?
java是面向对象语言,里面提供了n多对象,这些对象无论什么功能,只要是对象都进行抽取,最终抽取成一个名为object的类。你创建的任何对象都是object的子类,要么是直接的,要么是间接的。class Demo后面不写extends object,Demo也是object的子类。