method overloading

任何程序设计语言都具备的一项重要特性就是对名字的运用。当你创建一个对象时,也就给
此对象分配到的存储空间取了一个名字。所谓方法则是给某个动作取的名字。使用名字来描
述系统,可使程序更易于理解和修改。就好比书写散文——目的是让读者易于理解。
 

以返回值区分重载方法


你可能会这么想:“在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准
呢?能否考虑用方法的返回值来区分呢?”比如下面两个方法,虽然它们有同样的名字和形
式参数,但你却可以很容易地区分它们:
 
void f() {}
int f() {}
 
在类似 int x=f( )的语境中,如果编译器可根据上下文明确判断出语义,那么的确可以据此区
分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果(常被
称为“为了副作用而调用”)。你可能会调用方法而忽略其返回值:
 
f();

此时 Java 如何才能判断该调用哪一个 f( )呢?别人该如何理解这种代码呢?因此,根据方法
的返回值来区分重载方法是行不通的。

 

缺省构造器

 

如前所述,缺省构造器(又名“无参”构造器)是没有形式参数的。它的作用是创建一个“基
本对象”。如果你写的类中没有构造器,则编译器会自动帮你创建一个缺省构造器。例如:
 
//: c04:DefaultConstructor.java
 
class Bird {
  int i;
}
 
public class DefaultConstructor {
  public static void main(String[] args) {
    Bird nc = new Bird(); // Default!
  }

} ///:~

 

其中下面这一行:
 
new Bird();
 
创建了一个新对象,并调用其缺省构造器——即使你没有明确定义它。没有它的话,就无法
创建对象。但是,如果你已经定义了一个构造器(无论是否有参数),编译器就不会帮你自
动创建缺省构造器:
 
class Hat {
  Hat(int i) {}
  Hat(double d) {}
}

 

现在,要是你这么写:
 
new Hat();
 
编译器就会报错:没有找到匹配的构造器。这就好比,要是你没有提供任何构造器,编译器
会认为:“你需要一个构造器,让我给你制造一个吧”,但假如你已写了一个构造器,编译器
则会认为:“啊,你已写了一个构造器,所以你知道你在做什么;你是刻意省略了缺省构造
器。”

你可能感兴趣的:(java)