龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java方法过载

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
在任何程序设计语言中,一项重要的特性就是名字的运用。我们创建一个对象时,会分配到一个保存区域的名字。方法名代表的是一种具体的行动。通过用名字描述自己的系统,可使自

  在任何程序设计语言中,一项重要的特性就是名字的运用。我们创建一个对象时,会分配到一个保存区域的名字。方法名代表的是一种具体的行动。通过用名字描述自己的系统,可使自己的程序更易人们理解和修改。它非常象写散文――目的是与读者沟通。
  我们用名字引用或描述所有对象与方法。若名字选得好,可使自己及其他人更易理解自己的代码。
  将人类语言中存在细致差别的概念“映射”到一种程序设计语言中时,会出现一些非凡的问题。在日常生活中,我们用相同的词表达多种不同的含义――即词的“过载”。我们说“洗衬衫”、“洗车”以及“洗狗”。但若强制象下面这样说,就显得很愚蠢:“衬衫洗 衬衫”、“车洗 车”以及“狗洗 狗”。这是由于听众根本不需要对执行的行动作任何明确的区分。人类的大多数语言都具有很强的“冗余”性,所以即使漏掉了几个词,仍然可以推断出含义。我们不需要独一无二的标识符――可从具体的语境中推论出含义。
  大多数程序设计语言(非凡是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自变量;而假设没有其他话可说,就不使用。由于为显然相同的概念赋予了两个独立的名字,所以看起来可能有些古怪。幸运的是,方法过载答应我们为两者使用相同的名字。
  
精彩图集

赞助商链接