1、方法重载
任何程序设计语言都具备的一项重要特性就是对名字的运用。当创建一个对象时,也就给此对象分配到的存储空间取了一个名字。所谓方法则是给某个动作取的名字。通过使用名字,你可以引用所有的对象和方法。名字起的好可以使系统更易于理解和修改。
大多数程序设计语言(尤其是C)要求为每个方法(在这些语言中经常称为函数)都提供一个独一无二的标识符。所以绝不能用名为print()的函数显示了整数之后,又用一个名为print()的函数显示浮点数----每个函数都要有唯一的名称。
在java(和C++)里,构造器是强制重载方法名的另一个原因。既然构造器的名字已经由类名所决定,就只能有一个构造器名。那么要想用多种方式创建一个对象该怎么办呢?假设你要创建一个类,既可以用标准方式进行初始化,也可以从文件里读取信息来初始化。这就需要两个构造器:一个默认构造器,另一个取字符串作为形式参数---该字符串表示初始化对象所需的文件名称。由于都是构造器,所有它们必须有相同的名字,即类名。为了让方法名相同而形式参数不同的构造器同时存在,必须用到方法重载。同时,尽管方法重载是构造器所必须的,但它亦可应用于其他方法,且用法同样方便。
一、区分重载方法
要是几个方法有相同的名字,java如何才能知道你指的是哪一个呢?其实规则很简单:每个重载的方法都必须有一个独一无二的参数类型列表。
甚至参数顺序的不同也足以区分两个方法。不过,一般情况下别这么做,因为这会使代码难以维护。
二、涉及基本类型的重载
基本类型能从一个“较小”的类型自动提升至一个“较大”的类型,此过程一旦牵涉到重载,可能会造成一些混淆。
你会发现常数值5被当作int值处理,所有如果有某个重载方法接受int型参数,它就会被调用。至于其他情况,如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升至int型。
如果传入的实际参数大于重载方法声明的形式参数,出现什么情况?
在这里,方法接受较小的基本类型作为参数,如果传入的实际参数较大,就得通过类型转换来执行窄化转换。如果不这样做,编译器就会报错。
三、以返回值区分重载方法
例如: void f() {} int f() { return 1; }
两个方法虽然有相同的名字和形式参数,但却很容易区分它们。
只要编译器可以根据语境明确判断出语义,比如在int x = f() 中,那么的确可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果(这常被称为“为了副作用而调用”)这时你可能会调用方法而忽略其返回值。所以,根据方法的返回值来区分重载方法是行不通的。