1.1区分方法重载
要是几个方法有相同的名字.java如何才能知道你指的是那一个呢? 其实规则很简单:每个重载的方法必须有一个独一无二的参数类型列表。
稍加思考,就会觉得这是合理的。毕竟,对于名字相同的方法,除了参数类型的差异以外,还有什么办法能把他们区别开呢?
甚至参数顺序的不同也足以区分两个方法,不过,一般情况下别这么做,因为这会使代码难以维护:
// An highlighted block
public class OverloadingOrder {
static void f(String s, int i) {
System.out.println("String: " + s + ", int:" + i);
}
static void f(int i, String s) {
System.out.println("int: " + i + ", String:" + s);
}
public static void main(String[] args) {
f("String first", 11);
f(99, "Int first");
}
}
1.2 涉及基本类型的重载
基本类型能从一个 “较小” 的类型自动提升至一个 “较大” 的类型,此过程一旦牵涉到重载,可能会造成一些混淆。以下例子说明了将基本类型传递给重载方法时发生的情况:
public class PrimitiveOverloading {
void f1(char x){
System.out.println("f1(char) ");
}
void f1(byte x){
System.out.println("f1(byte) " );
}
void f1(short x){
System.out.println("f1(short) ");
}
void f1(int x){
System.out.println("f1(int) ");
}
void f1(long x){
System.out.println("f1(long) ");
}
void f1(float x){
System.out.println("f1(float) ");
}
void f1(double x){
System.out.println("f1(double) ");
}
void f2(char x){
System.out.println("f2(char) ");
}
void f2(byte x){
System.out.println("f2(byte) " );
}
void f2(short x){
System.out.println("f2(short) ");
}
// void f2(int x){
// System.out.println("f2(int) ");
// }
void f2(long x){
System.out.println("f2(long) ");
}
void f2(float x){
System.out.println("f2(float) ");
}
void f2(double x){
System.out.println("f2(double) ");
}
public static void main(String[] args) {
PrimitiveOverloading p = new PrimitiveOverloading();
p.f1((byte) 5);
p.f2(5);
p.f1('1');// 把f1(char x) 注释掉会调用f1(int)方法
}
}
你会发现常数值5被当作int值处理,如果把f1(int x)方法注释掉,就会被提升至long,这是因为如果传入的参数类型小于方法中声明的参数类型,实际数据类型就会被提升。char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char类型提升至int。
1.3 以返回值区分方法重载
在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值区分呢? 比如下面两个方法,虽然他们具有相同的名字和形式参数,但是却很容易区分他们:
void f(){}
int f(){return 1;}
只要编译器可以根据语境明确判断出语义, 比如在int x =f()中,那么的却可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果(这常被成为,为了副作用而调用) 这时你可能调用方法而忽略其返回值。所以,如果像下面这样调用方法:
f();
这是Java如何才能判断该调用哪一个f()呢? 别人该如何理解这种代码呢?因此,根据方法的返回值来区分重载方法是行不通的。