在任何程序设计语言中一项重要的特性就是名字的运用我们创建一个对象时会分配到一个保存区域的名字方法名代表的是一种具体的行动通过用名字描述自己的系统可使自己的程序更易人们理解和修改它非常象写散文——目的是与读者沟通
我们用名字引用或描述所有对象与方法若名字选得好可使自己及其他人更易理解自己的代码
将人类语言中存在细致差别的概念映射到一种程序设计语言中时会出现一些特殊的问题在日常生活中我们用相同的词表达多种不同的含义——即词的过载我们说洗衬衫洗车以及洗狗但若强制象下面这样说就显得很愚蠢衬衫洗 衬衫车洗 车以及狗洗 狗这是由于听众根本不需要对执行的行动作任何明确的区分人类的大多数语言都具有很强的冗余性所以即使漏掉了几个词仍然可以推断出含义我们不需要独一无二的标识符——可从具体的语境中推论出含义
大多数程序设计语言(特别是C)要求我们为每个函数都设定一个独一无二的标识符所以绝对不能用一个名为print()的函数来显示整数再用另一个print()显示浮点数——每个函数都要求具备唯一的名字
在Java里另一项因素强迫方法名出现过载情况构建器由于构建器的名字由类名决定所以只能有一个构建器名称但假若我们想用多种方式创建一个对象呢?例如假设我们想创建一个类令其用标准方式进行初始化另外从文件里读取信息来初始化此时我们需要两个构建器一个没有自变量(默认构建器)另一个将字串作为自变量——用于初始化对象的那个文件的名字由于都是构建器所以它们必须有相同的名字亦即类名所以为了让相同的方法名伴随不同的自变量类型使用方法过载是非常关键的一项措施同时尽管方法过载是构建器必需的但它亦可应用于其他任何方法且用法非常方便
在下面这个例子里我们向大家同时展示了过载构建器和过载的原始方法
//: Overloadingjava
// Demonstration of both constructor
// and ordinary method overloading
import javautil*;
class Tree {
int height;
Tree() {
prt(Planting a seedling);
height = ;
}
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) {
Systemoutprintln(s);
}
}
public class Overloading {
public static void main(String[] args) {
for(int i = ; i < 5; i++) {
Tree t = new Tree(i);
();
("overloaded method");
}
// Overloaded constructor:
new Tree();
}
} ///:~
Tree既可创建成一颗种子,不含任何自变量;亦可创建成生长在苗圃中的植物。Tw.wINgwIT.CoM为支持这种创建,共使用了两个构建器,一个没有自变量(我们把没有自变量的构建器称作“默认构建器”,注释①),另一个采用现成的高度。
①:在Sun公司出版的一些Java资料中,用简陋但很说明问题的词语称呼这类构建器——“无参数构建器”(no-arg constructors)。但“默认构建器”这个称呼已使用了许多年,所以我选择了它。
我们也有可能希望通过多种途径调用info()方法。例如,假设我们有一条额外的消息想显示出来,就使用String自变量;而假设没有其他话可说,就不使用。由于为显然相同的概念赋予了两个独立的名字,所以看起来可能有些古怪。幸运的是,方法过载允许我们为两者使用相同的名字。