要领过载
在任何措施设计语言中,一项重要的特性就是名字的运用。我们建设一个工具时,会分派到一个生存区域的名字。要领名代表的是一种详细的动作。通过用名字描写本身的系统,可使本身的措施更易人们领略和修改。它很是象写散文——目标是与读者相同。
我们用名字引用或描写所有工具与要领。若名字选得好,可使本身及其他人更易领略本身的代码。
将人类语言中存在细致不同的观念“映射”到一种措施设计语言中时,会呈现一些非凡的问题。在日常糊口中,我们用沟通的词表达多种差异的寄义——即词的“过载”。我们说“洗衬衫”、“洗车”以及“洗狗”。但若强制象下面这样说,就显得很愚蠢:“衬衫洗 衬衫”、“车洗 车”以及“狗洗 狗”。这是由于听众基础不需要对执行的行行动任何明晰的区分。人类的大大都语言都具有很强的“冗余”性,所以纵然遗漏了几个词,仍然可以揣度出寄义。我们不需要唯一无二的标识符——可从详细的语境中推论出寄义。
大大都措施设计语言(出格是C)要求我们为每个函数都设定一个唯一无二的标识符。所以绝对不能用一个名为print()的函数来显示整数,再用另一个print()显示浮点数——每个函数都要求具备独一的名字。
在Java里,另一项因素强迫要领名呈现过载环境:构建器。由于构建器的名字由类名抉择,所以只能有一个构建器名称。但假使我们想用多种方法建设一个工具呢?譬喻,假设我们想建设一个类,令其用尺度方法举办初始化,别的从文件里读取信息来初始化。此时,我们需要两个构建器,一个没有自变量(默认构建器),另一个将字串作为自变量——用于初始化工具的谁人文件的名字。由于都是构建器,所以它们必需有沟通的名字,亦即类名。所觉得了让沟通的要领名陪伴差异的自变量范例利用,“要领过载”长短常要害的一项法子。同时,尽量要领过载是构建器必须的,但它亦可应用于其他任何要领,且用法很是利便。
在下面这个例子里,我们向各人同时展示了过载构建器和过载的原始要领:
//: Overloading.java // Demonstration of both constructor // and ordinary method overloading. import java.util.*; class Tree { int height; Tree() { prt("Planting a seedling"); height = 0; } Tree(int i) { prt("Creating new Tree that is " + i + " feet tall"); height = i; } void info() { prt("Tree is " + height + " feet tall"); } void info(String s) { prt(s + ": Tree is " + height + " feet tall"); } static void prt(String s) { System.out.println(s); } } public class Overloading { public static void main(String[] args) { for(int i = 0; i < 5; i++) { Tree t = new Tree(i); t.info(); t.info("overloaded method"); } // Overloaded constructor: new Tree(); } } ///:~
Tree既可建设成一颗种子,不含任何自变量;亦可建设成发展在苗圃中的植物。为支持这种建设,共利用了两个构建器,一个没有自变量(我们把没有自变量的构建器称作“默认构建器”,注释①),另一个回收现成的高度。
①:在Sun公司出书的一些Java资料中,用简略但很说明问题的词语称号这类构建器——“无参数构建器”(no-arg constructors)。但“默认构建器”这个称号已利用了很多年,所以我选择了它。
我们也有大概但愿通过多种途径挪用info()要领。譬喻,假设我们有一条特另外动静想显示出来,就利用String自变量;而假设没有其他话可说,就不利用。由于为显然沟通的观念赋予了两个独立的名字,所以看起来大概有些离奇。幸运的是,要领过载答允我们为两者利用沟通的名字。