JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程

Posted 照破山河万朵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程相关的知识,希望对你有一定的参考价值。

一.

子父类中构造函数的特点。

举例演示一下,

类中不写构造函数,它里面也是有的。只是写出来,可以看的更清楚一些。

DOS结果显示比较特别,在有Zi run的情况下,还有Fu run的存在。按道理说,子类创建的对象,应该就是子类的内容,这里突然出现一个父类的内容。而且里面运算的时候,只涉及对象的初始化。

现在讨论为什么子类创建对象构造函数初始化时,会有父类的构造函数也有初始化,而且位于子类之前。

由上面截图引发的思考,什么时候super()会出现?之前谈论的this,是为了区分本类和对象中重名的东西,super出现的原因是什么?

真实的情况如下,Zi()构造函数中,存在super();语句,可以对比之前的this(),this()是指用this关键字加个括号来代表本类中的构造函数(this()这个之前并没有讲解到)。相同的,用super关键字用来调用父类中的函数,super和this关键字很相似。居然子类的构造函数中,还先调用父类的构造函数。

正确的流程叙述一遍:main中先进行new zi(),在堆中开辟空间,分配地址值,默认初始化没有东西(因为没有成员变量)。接着进行构造初始化,就访问到Zi()了,这个Zi()进入内存后,里面就开始执行了。子类构造函数中有三句,super();System.out.println("zi run");和return;(return被影藏了)。→super();是隐式的,不写也存在。在这样的继承子类构造函数中,super是一定存在的(?)。return什么时候隐藏,或者应该在什么地方存在

有super()的存在,就指向了父类,Fu()构造函数就进栈了,因此就先输出Fun run这句话。然后再输出zi run,和运行return。

这里为什么super调用的是空参数构造函数?原因在于,万一父类中没有书写构造函数,那么它就是默认的构造函数,它就是一个空参数列表的函数。(解释挺奇怪的)

谁说父类构造函数里面一定是空参,里面添加了其他东西。DOS结果显示出错。子类有super();默认就是有空参的构造函数,这时父类中没有空参构造函数,就会失败。

这时候又引出,谁说定义类的时候,一定要写空参的构造函数?想写什么参数就写什么参数,想怎么构造初始化,就怎么构造初始化。这可以用super直接指定。那就意味着,在有参数列表的构造函数时,空参数的构造函数就不存在了?那就是说子类中一定要调用父类的构造函数,只是默认的父类构造函数可以省略不写。

构造函数覆盖不?

为什么没有覆盖?子类中的构造函数和父类中的构造函数能相同么?不可能,函数名就不一样。

注意:子父类中构造函数不能不在。

就继承而言,子类可以继承父类的很多的东西,但是父类的构造函数是继承不了的。只能通过super()来调用父类的构造函数,这个就叫做子类的实例化过程。实例化过程必须要先经过父类的初始化。

子类的实例化就是创建对象。

这就是它的初始化过程。对于类的建立也需要初始化么?

现在又对子类中的构造函数进行了扩展,类中不止一个构造函数。这符合实际情况,不可能类中只有一个默认的构造函数。

结果是什么呢?DOS显示的结果为A,D。这里是在强调实例化的存在。一定要注意影藏语句的存在,在实际的开发中很多是没有书写super()的。

还有一点要强调的是,如果父类中没有空参数构造函数(没有话,需要自己自定义一个空参数构造函数),子类的实例化过程就进行不下去,DOS就会报错。→有其他构造函数存在时,默认的空参数构造函数就会消失,但是子类实例化时必须要空参数构造函数,这样一来,就必须在多个构造函数存在的情况下,自己构建一个空参数的构造函数。

空参数构造函数和默认构造函数。如果没有自定义空参数构造函数,那会不会有系统默认的构造函数存在,从而子类的实例化过程可以继续运行。

A

本例说明什么?当父类中定义了具有参数列表的构造参数时,空参数构造函数就不存在了。导致子类实例化的过程出错。

B

父类构造函数为空参数列表,和里面的执行语句不符合。

C

D

本例说明父类在没有定义构造函数时,是存在一个空参数的默认构造函数的。

注意:子类的实例化过程是否一定要进行

实例化过程就是调用父类的空参数构造函数,这不一定的,但是由于继承的关系,调用父类构造函数是肯定的,但是可以调用空参数,也可以调用其他构造函数。这样一来,子类的实例化过程就不是必须的。

 

以上是关于JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-内存图解

JAVA-初步认识-第八章-继承-子父类中成员函数特点-覆盖

JAVA-初步认识-第八章-继承-子父类中成员变量的特点

JAVA-初步认识-第九章-抽象类-细节

JAVA-初步认识-第九章-抽象类-概述

JAVA-初步认识-第九章-接口-细节