1:重载是指一个类中定义多个方法名相同但参数列表不同的方法,在编译时根据方法参数的个数和类型来决定绑定哪个方法;
重写是指在子类中定义和父类方法签名完全一样的方法,在程序运行时根据对象的类型不同而调用不同的方法。(注意不是对象的引用)
看如下代码:
public class Test {
public static void main(String args[]) {
SuperF obj = new Sub();
Goo goo = new Goo();
goo.g(obj);
}
}
class SuperF{
public void f() {
System.out.println("Super.f()");
}
}
class Sub extends SuperF{
public void f() {
System.out.println("Sub.f()");
}
}
class Goo{
public void g(SuperF obj) {
System.out.println("g(SuperF)");
obj.f();
}
public void g(sub obj) {
System.out.println("g(sub)");
obj.f();
}
}
结果输出:
g(SuperF)
Sub.f()
2:重载遵循所谓的“编译期绑定”,即在编译期根据参数变量的类型决定该调用哪个方法。上面代码中obj的类型为SuperF,因此Goo的g(SuperF obj)被调用
重写遵循所谓的“运行期绑定”,即在运行时根据引用指向的实际对象来决定调用哪个方法。上面代码中obj指向的实际对象为Sub类型,因此会调用Sub重写后的f()方法。