构造函数的前世今生
前言:当我们在讨论一个新名词、一个新概念或一个新理论新思想时,其实我们更应该先考虑一下这个新事物是从哪里产生的?是为了解决什么问题而提出来的?或者说没有这一新理论,原来的旧理论哪里不方便了?……
也许我们在思考上面问题的过程中,原本困扰我们的那些疑问也就迎刃而解了。
好了,废话不多说 ,我们就用这个方法来解决一下题目所提出的新名词——构造函数。
构造函数是从哪里提出来的?
答:这一概念是来自于程序设计语言中面向对象这一思想,在构造类的时候被提出的,是由类引出的。在类实例化时,程序为每个对象都创建了一个默认的初始化方法,而这个方法被称为构造函数。
从构造函数的前世说起
在面向对象这一思想提出后,最吸引人的概念就是抽象类了。我们通过千辛万苦,过五关斩六将的毅力设计出一个类来,然后我们就可以肆意妄为的实例化对象,这让很多单身程序猿狠狠地爽了一把,因为我们不仅仅可以new出任意多的对象啦,我们还可以——然后……嘿嘿嘿,你懂的。
Java程序语言更是将面向对象——这一思想,发挥的淋漓尽致,在这里我们不谈具体的语言,思考问题的方式才是关键,有道无术,术尚可求,有术无道,止于术。这也就是说构造函数本身并不具吸引力,让我们疯狂的是大师们是如何提出这一思想的。还回到类这一主题,设计类最初的目的就是为了表示数据,使数据更加符合人的思维模式-----将数据隐藏而用其成员方法访问其内部成员变量(封装)。
所以大师们在刚开始设计类时,从人类的思维模式出发,将类一般划分成了两个部分:成员变量和成员函数(成员方法),为了得到这一原本的目的,大师们在设计它的时候,通常的做法是把成员变量设置成私有,而把成员方法设置成公开。这样我们大家可以通过实例化对象,然后用其成员方法来操纵其成员属性,这一种方式很好地体现了保护作用的特点——将数据隐藏。
好,你马上要问了,那为什么我们非要将数据隐藏呢?非常好,你已经get到了我们开篇讲到的那种苏格拉底式的精神了。
答:将数据隐藏是为了更高效的工作,在企业中,我们都知道分工明确是非常重要的,尤其是大公司更是如此。那为什么将数据隐藏就能提高我们的工作效率呢?当然,将数据隐藏,我们通过一个一个的函数名调用而不必懂得函数内部的工作原理才能完成工作那不是更快,何乐而不为呢?然而这个优点只是其一。当这一思想在实际的应用道路上曲折前行时,因为分工明确了,我们程序员更加专注于自己的任务了,人们发现公司整个系统bug减少了,安全性更高了……既然这样,那我们就大刀阔斧的用这一思想理论吧!于是乎,这一思想势如破竹,更以迅雷不及掩耳之势在短短的几年内就统治了几乎所有现在流行的高级程序语言。
构造函数的开场白
说了这么多,可与构造函数并没有半毛钱的关系啊!不要急,该它出场的时候它自然就出场了,不是不到,时间未到。当我们废了九牛二虎的力气终于将一个类设计出来时,但接着问题来了,怎么赋值呢?你可能会自然地想到像下面这样的赋值(初始化)方式:
class Person {
int id;
string name;
}
Person girl = {123, "LostArt"};
但,我现在告诉你,这样是肯定不可行的,或者说是暂时还不可行的。那为什么呢?很明显,如果数据是公有的,就可以这样了,但问题是:数据不是公有的。如果数据是公有的,这明显违背了当初设计类时的一个主要初衷——隐藏数据。好好的一个girl ,你竟然让大家看到了她里面的构造(结构),你懂的,这是万万使不得的呀!那该如何才能使得呢?最简单的办法就是你自己在刚才设计好的类里面,再多添加一个赋值的方法,让大家通过这个方法来初始化。不管是谁,在最开始用这个Person类时,必须先调用你预先写好的这个赋值方法。
现在用符合人的思维想一下,既然在类设计成时,如果实例化,都要先调用这个方法,那为什么不在设计这个面向对象语言开始时,事先让编译器自动的为你定义的类赋值呢?或者说你懒得自己调用自己的这个赋值方法了,因为这是一个很麻烦的事情,如果能让程序默认地为你赋值,那何乐而不为呢?好了,我们聊到这里,时机已成熟,构造函数这一概念已经呼之欲出了。
构造函数的出生
大师们为了表示这个赋值函数很特别,就特别地为这个特别的函数起了一个特别的名字——构造函数,而且大师们还赋予了它一些特别的性质:
- 函数名必须与类名相同。
- 函数没有返回类型,也不能定义为void,在函数名前面不声明方法类型。
- 函数的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
那大师们为什么用构造一词呢?能不能换一个词呢?当然能,然而从艺术的角度看,构造一词真的再合适不过了。见名知意,一说构造,你马上会想到通过一个模具,然后铸成了一个实实在在的东西。那么,在计算机程序语言中类不就是一个模具(模板)吗,而实例化的对象刚好就是那个实实在在的东西了。这个词用的恰到好处,多一分显得抽象多余,少一分则显得表达不足。
构造函数我们明白了,我们好像又发现一个新现象,艺术不分学科,不分国界。而这个艺术就是所有学科的灵魂了。说到这里,不得不赞叹大师就是大师,已经能做到学科间的融会贯通了。而那些所谓的隔行如隔山的说法只是我们管中窥豹罢了。想要一览庐山的真正瑰丽面貌,还是要走出山中,站在不同的角度去欣赏去发现才行。
真心希望在摸索艺术道路上前行的人都能成为这样的大师,在这个浮躁的年度里能够坚持探讨艺术的本源,触摸到那个已经失落很久了的艺术之灵魂。蓦然回首,那人却在灯火阑珊处,刚刚好。