成员方法重载
学习重载之前,我们来了解一下在java中方法的特征。
在java中,每一个方法都有自己的特征,其特征主要是指方法名以及方法的参数。
void method1(){}
void method2(){}
method1()和method2()可以被理解为是两个方法名不同的方法,即方法的特征不一致。
void method1(int x){}
void method1(){}
第一个method1()与第二个method1()虽然名字一样,但是却有不同的参数,因此,这两个同名方法仍有着不同的特征。
对于java编译器来说,它只依据方法的名称、参数的不同来判断两个方法是否相同,如果出现两个名称相同、参数也完全一致的方法,那么编译器就认为这两个方法是完全一样的,也就是说方法被重复定义!
以下定义是错误的:
class ClassName
{
void m1(){}
void m1(){}
}
对于以上两个方法定义语句,java解释器认为这两个方法完全相同,当执行到第二条语句时,它会告诉你方法m1()已在类ClassName中被定义!
可以这样理解,当我们在一个类中不能定义相同名称的多个方法,除非这些方法具有不同的方法特征(参数的不一致)。将上面语句修改为:
class ClassName
{
void m1(int x){}
void m1(){}
}
这样,虽然方法名相同,但由于两个方法的参数不一致,因此,编译器就认为这是两个不同的方法,从而不会产生歧义。
好,在这里,大家可能就会质疑,把其中的某个方法换成不同的名称不也可以正常运行吗?
对,这样确实可以解决问题,但我们知道,在现实中,往往一个类会实现复杂的功能,其中定义的多种方法可能实现的功能意义都是一样,比如我们已经熟悉的System类中的静态方法println(),在该类中println()被定义了多个,每一个方法都有不同的参数,现在我们已知道每一个println()都具有相同的功能:在控制台上输出内容!我们来假想一下,如果按照每个方法定义一个不同名称,那么我们将在System类中定义十多种不同名称的打印方法,虽然功能实现了,首先,我们是否需要编写代码前给这十几种方法取不同名称,并且还得保证名称唯一,这就会增加我们的工作量;其次我们还得记住每一个方法名对应的功能,如果稍有记错,那就会得到错误的结果!
因此,我们有更好的解决办法,通过重载,可以在一个类中定义相同名称、不同参数的实现相同功能的多个方法,这样就避免了给每个方法取不同名称、熟记每个不同名的方法对应的功能的额外工作量,提高了我们的开发效率。
当一个类中的多个同名方法满足以下条件时之一时,即实现了方法重载:
a.不同的参数个数
b.不同的参数类型
c.不同的参数顺序
小测试:以下哪几组方法实现了重载,满足了重载的那一个条件?
组一:
void m1(int x){}
void m1(int x, int y){}
组二:
void m1(int x, String str){}
void m1(String str, int x){}
组三:
void m1(int x, int y){}
void m1(int y, int x){}
组四:
void m1(int x){}
int m1(int x, int y){}
组五:
void m1(int x){}
void m2(int x){}