我们总是说方法重载是静态多态,而重载是运行时多态。我们这里所说的静态到底是什么意思?调用方法是否可以在编译代码时解决?那么普通方法调用和最终方法调用之间有什么区别?编译时链接哪一个?
方法重载意味着根据输入来制作功能的多个版本。例如:
public Double doSomething(Double x) { ... } public Object doSomething(Object y) { ... }
在编译时选择要调用的方法。例如:
Double obj1 = new Double(); doSomething(obj1); // calls the Double version Object obj2 = new Object(); doSomething(obj2); // calls the Object version Object obj3 = new Double(); doSomething(obj3); // calls the Object version because the compilers see the // type as Object // This makes more sense when you consider something like public void myMethod(Object o) { doSomething(o); } myMethod(new Double(5)); // inside the call to myMethod, it sees only that it has an Object // it can't tell that it's a Double at compile time
方法覆盖意味着通过原始方法的子类定义方法的新版本
class Parent { public void myMethod() { ... } } class Child extends Parent { @Override public void myMethod() { ... } } Parent p = new Parent(); p.myMethod(); // calls Parent's myMethod Child c = new Child(); c.myMethod(); // calls Child's myMethod Parent pc = new Child(); pc.myMethod(); // call's Child's myMethod because the type is checked at runtime // rather than compile time
希望对您有所帮助