- 重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
- 重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
- 重载在编译阶段,由编译器根据传递给方法的参数来区分方法,例如
- 而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法,例如
- 有没有发生重写,可以使用 @Override 来检查
MyObject obj = ... obj.test(123); // 应该是调用 test(int x) 这个方法 obj.test("abc"); // 应该是调用 test(String x) 这个方法
Super obj = ... obj.test(); // 到底是调用父类,还是子类的 test 方法,必须检查引用对象的实际类型才能确定
P.S.
- 括号内的说明是为了严谨,自己知道就行,回答时不必说出,这样比较简洁
- 个人觉得,在回答方法重载时,不必去细说什么参数的类型、个数、顺序,就说参数列表不同就完了
- 个人觉得,重点在于点出:重载是编译时由编译器来区分方法,而重写是运行时由解释器来区分方法
- 语法细节,问了再说,不问不必说
- 重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符
- 重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常
- 重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类