JAVA-初步认识-第七章-构造函数重载
一.
题目为构造函数重载,可以想到之前一般函数的重载,概念之间总是相互联系的。
某一个事物是什么,有什么特点介绍完了之后,下面就是怎么用(初始化),什么时候用?
二.
什么时候定义构造函数呢?
在描述事物时,该事物一存在就就具备的一些内容,这些内容都定义在构造函数中。
一般方法是说这些事物都具备这个功能,我们就把它定义在一般方法之中。而现实生活中的对象一产生都具备的东西,都定义在构造函数中。一产生就具备的,我们还没指挥它呢,就出现这些内容,我们就定义在构造函数中,指挥的时候是调用的其他的功能。
以一个源程序来讲解:(现在,我们来讨论的就是,构造函数中一出现就具备的内容。)
上面是描述类和创建类,如果编译,运行,结果如下。两条输出语句,一条来自构造函数里的输出,一条来自一般函数speak()的输出。
程序运行后,输出的结果为null,成员变量没有进行赋值,都是默认值。我们希望,对象一出现就具备一些内容。无论什么东西,只要一出现,就具备一些内容。
接着,就对源程序进行了修改,在构造函数中,对成员变量进行了赋值(新建对象,构造函数初始化时,对成员变量进行了赋值和直接在类中对成员变量进行赋值有什么区别么?) 人刚一诞生,就有确定的名字和年龄。再次运行程序,结果如下:
jvm从主函数进入,执行了两步,在新建对象时执行了构造函数,然后执行了一般函数。在构造函数中,对类中定义的成员变量进行了赋值,并打印person run,接着在调用一般函数时,输出了成员变量(此时,成员变量已经赋完值)。我们认为婴儿一出生,就应该有一个默认的名字和一个默认的年龄。也就意味着创建更多的婴儿,都是这个特点。因为这些婴儿都是从构造函数这儿初始化。
拓展一下,将成员变量的初始化换个地方。下面是将初始化放置在一般函数中,这带来一个问题,只有调用一般函数,才会对成员变量进行初始化,这和初衷是想违背的。开始是要求对象一出生就具备的东西。如果没有调用speak()函数的话,在新建对象时,就没有姓名和年龄。
还有一种情况,小孩一出生就有名字,孩子一建立就带着值出来。就是说并非是上面的构造函数的初始化方式。
这里产生了两个构造函数,意味着不同的构造函数可以给不同的对象初始化。
对上面的两个种构造函数,进行不同的变量初始化之后,结果如下。
这里始终有一个问题困扰我,为什么不直接在成员变量定义的时候赋值?我猜可能是创建不同的对象时,不能让所有对象的值都一样。更进步说,描述类中的成员变量是private的,能否直接赋值还是个问题。
接着定义更多的构造函数,(这些都是给对象赋值。构造函数可以这么理解?和我之前想的给成员变量赋值不一样。)
运行结果如下,
这种采用构造函数将对象初始化的方式,在新建对象时,在对象的括号中要输入参数。
一个类中,可以有多个构造函数,可以对n多对象初始化。多个构造函数在一个类中出现,它们的存在形式就只能有一种,这就叫做重载。
重载什么特点,方法名相同,参数列表不同(参数个数,参数类型)。
这两个构造函数是不一样的,java的严谨性,这就是重载。参数的顺序也是很重要的,比如两个参数int a, boolean b。如果一个数据输入为true,那肯定不合适,这说明参数顺序也是很重要的。当时学习功能化函数中参数列表时,有形式参数1,形式参数2,这也表明参数顺序很重要。
一个类中,出现了多个构造函数时,它们必须以重载的形式来体现。它可以给不同的对象,进行不同的初始化。