Java 重载和重写,重载是指方法名称相同但参数签名不同(参数个数、类型或顺序不同),重写是指子类重写与父类相同参数签名的方法。对一个函数调用而言,可能有多个匹配的方法,有时候选择哪一个并不是那么明显。我们来看个例子,这是基类代码:
public class Base {
public int sum(int a, int b){
System.out.println("base_int_int");
return a+b;
}
}
它定义了方法sum,下面是子类代码:
public class Child extends Base {
public long sum(long a, long b){
System.out.println("child_long_long");
return a+b;
}
}
以下是调用的代码:
public class coolcou {
public static void main(String[] args) {
Child c = new Child();
int a = 2;
int b = 3;
c.sum(a, b);
}
}
Child和Base都定义了sum方法,这里调用的是哪个sum方法呢?子类的sum方法参数类型虽然不完全匹配但是是兼容的,父类的sum方法参数类型是完全匹配的。程序输出为:
父类类型完全匹配的方法被调用了。如果父类代码改成下面这样呢?
public class Base {
public long sum(int a, long b){
System.out.println("base_int_long");
return a+b;
}
}
父类方法类型也不完全匹配了。程序输出为:
调用的还是父类的方法。父类和子类的两个方法的类型都不完全匹配,为什么调用父类的呢?因为父类的更匹配一些。现在修改一下子类代码,更改为:
public class Child extends Base {
public long sum(int a, long b){
System.out.println("child_int_long");
return a+b;
}
}
程序输出变为了:
child_int_long
终于调用了子类的方法。可以看出,当有多个重名函数的时候,在决定要调用哪个函数的过程中,首先是按照参数类型进行匹配的,换句话说,寻找在所有重载版本中最匹配的,然后才看变量的动态类型,进行动态绑定。
酷客教程相关文章:
评论前必须登录!
注册