引言:
D四、java构造器进行初始化中我们提到了方法的重载。在C语言中我们规定的函数名是独一无二的,而java(c++)中因为有了构造器的存在,为了实现用多种方法初始化对象,我们必须要对构造器进行重载,对方法进行重载。下面我们看一个例子:
class cat{
int height;
cat(){
System.out.println("Raising a cat");
height = 0;
}
cat(int i){
height = i;
System.out.println("The cat is "+height+" m");
}
void info() {
System.out.println("There is "+height+" m");
}
void info(String s) {
System.out.println(s+" is "+height+" m");
}
}
public class OverLoading{
public static void main(String []args) {
for(int i=0;i<2;i++) {
cat c = new cat(i);
c.info();
c.info("cat");
}
new cat();
}
}
输出:
上面你会发现,我重载了构造器,也重载了类里面的方法。编译器可以很容易的辨认出我需要初始化调用的是哪一个方法,也可以很轻易的知道需要调用类里面的哪一个方法。那么是如何辨别的呢?所以接下来我们就需要知道如何区分重载的方法。
区分重载方法
c++中区分重载方法是靠参数列表返回值来区分的,其实java也是这样的。上面的列子中,info()方法和info(String s)方法就是通过参数列表来区分,我们可以通过参数数据类型,参数顺序来区分,这些都是很好理解的。这里我们不会去讨论这个大家都很熟悉的问题,我要说的是基本类型的重载。基本类型能从一个较小的类型提升到一个较大的类型,但是涉及到重载就会有一些不一样。
比如下面这个例子:
class cat{
void info(int i) {
System.out.println("int");
}
void info(double i) {
System.out.println("double");
}
}
public class OverLoading{
public static void main(String []args) {
cat c = new cat();
c.info(3);
c.info(4.5);
c.info('a');//char类型转换int 实际<列表参数
}
}
输出: int double int
上面的例子中,我们传给方法的实际参数会依次的对应方法进行调用,当我们传递的实际参数比列表参数类型小的时候,就会将实际参数提升。例如上面中将char类型的数据直接提升到int型。那么如果是实际参数大于列表参数呢???看下面例子:
class cat{
void info(char c) {
System.out.println("char");
}
void info(byte c) {
System.out.println("byte");
}
}
public class OverLoading{
public static void main(String []args) {
cat c = new cat();
c.info('a');
//c.info(3);
//编译器会报错:The method info(char) in the type cat is not applicable
//for the arguments (int)
c.info((byte)3);
}
}
输出: char byte
所以我们可以看出,当实际参数比列表参数类型大时,必须要进行类型转换,否则编译器就会报错。在引言那里我们提到了还可以通过返回值来区分重载方法(只是个玩笑,我们是不可能通过返回值来区分重载方法的,java编译器不知道要调用哪一个)。
后记:
虽然你知道了区分调用重载方法,但是当有两个对象A,B(同一个类),要怎么去调用区别里面的方法呢?这就需要下一节讲解了,如有误,请指出,谢谢。