Java 的 Overload 和 Override
override:覆盖,表示在子类中一个函数覆盖了基类中的同名函数名称,或者局部的某个函数覆盖了全局的某个同名函数名称。被覆盖的函数通常不能直接被调用,而是必须借助一些显式的强制手段。
override 是运行时概念。
overload:重载,表示在同一级子类或同一命名空间中,一个函数因参数类型与个数不同可以有不同的实现。可以表现多态性。被重载的函数,通常每个不同的实现都可以单独被调用。
overload 是编译时概念。
overload:重载
class Foo { public void print(String str) { System.out.println("String"); } public void print(Object o) { System.out.println("Object"); } public void print(int i) { System.out.println("int"); } public void print(long l) { System.out.println("long"); } public void print(float f) { System.out.println("float"); } public void print(double d) { System.out.println("double"); } public void print(int i, float f) { System.out.println("int and float"); } public void print(long l, double d) { System.out.println("long and double"); } } public class OverloadOverride { public static void main(String[] args) { Foo f = new Foo(); f.print(12); f.print(78.98); f.print(12L); f.print(78.98F); f.print('A'); f.print("A"); f.print(1, 1.0); } }
输出:
int double long float int String long and double
override:覆盖
class Father { public void done(Object o) { System.out.println("father"); } } class Son extends Father { public void done(String str) { System.out.println("son"); } } public class OverloadOverride { public static void main(String[] args) { Father ff = new Son(); ff.done(new String()); ((Son) ff).done(new String()); Son ss = new Son(); ss.done(new String()); } }
输出:
father
son
son
上面的例子中的 Son 实际上是 overload 方法,子类 Son 中继承了父类的 done(Object o) 方法,然后重载了 done(String str) 方法。
父类的引用只能引用父类的方法 或 被子类 override 重写了的方法所以获得了以上输出。
真正的 Override :
class Father { public void done(Object o) { System.out.println("father"); } } class Son extends Father { public void done(Object o) { System.out.println("Override father"); } public void done(String str) { System.out.println("son"); } } public class OverloadOverride { public static void main(String[] args) { Father ff = new Son(); ff.done(new String()); ((Father) ff).done(new String()); Son ss = new Son(); ss.done(new String()); } }
输出:
Override father
Override father
son
全部源代码:
class Foo { public void print(String str) { System.out.println("String"); } public void print(Object o) { System.out.println("Object"); } public void print(int i) { System.out.println("int"); } public void print(long l) { System.out.println("long"); } public void print(float f) { System.out.println("float"); } public void print(double d) { System.out.println("double"); } public void print(int i, float f) { System.out.println("int and float"); } public void print(long l, double d) { System.out.println("long and double"); } } class Father { // public void done(String str) { public void done(Object o) { System.out.println("father"); } } class Son extends Father { // Override public void done(Object o) { System.out.println("Override from father"); } public void done(String str) { System.out.println("son"); } } public class OverloadOverride { public static void main(String[] args) { Father ff = new Son(); ff.done(new String()); ((Son) ff).done(new String()); // Son ss = new Son(); // ss.done(new String()); Foo f = new Foo(); f.print(12); f.print(78.98); f.print(12L); f.print(78.98F); f.print('A'); f.print("A"); f.print(1, 1.0); } }
注意:在初始化代码块和构造函数部分要尽量避免调用成员方法(除非确定该成员方法不会被子类重写),因为成员方法可能被子类重写,造成不可预料的情况。
浙公网安备 33010602011771号