当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java进阶

Java方法过载


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