重载 overload 和重写 overried 的区别
简介:
本内容介绍了面向对象编程中的“重载”与“重写”概念。重载指同一类中方法名相同但参数列表不同,由编译器在编译阶段根据参数选择方法;重写指父子类中方法名与参数列表均相同,由虚拟机在运行时根据对象实际类型确定调用哪个方法。内容还包含代码示例及重写的检查方式(如 @Override 注解),并强调了重写时访问修饰符、异常类型和返回值类型的规则。
- 重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
- 重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
- 重载在编译阶段,由编译器根据传递给方法的参数来区分方法
- 而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法
- 有没有发生重写,可以使用 @Override 来检查
// 重载
MyObject obj = ...
obj.test(123); // 应该是调用 test(int x) 这个方法
obj.test("abc"); // 应该是调用 test(String x) 这个方法
// 重写
Super obj = ...
obj.test(); // 到底是调用父类,还是子类的 test 方法,必须检查引用对象的实际类型才能确定
- 重载是编译时由编译器来区分方法,而重写是运行时由解释器来区分方法
- 重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符
- 重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常
- 重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类