Java:重载和重写
对 Java 中的 重载和重写 这个概念,做一个微不足道的小小小小结
重载
重载:编译时多态,同一个类中的同名的方法,参数列表不同,与返回值无关。
有以下几点:
- 方法名必须相同;
- 方法的参数列表一定不一样;
- 访问修饰符和返回值类型可以相同也可以不同;
重写
重写(又名覆盖):运行时多态,发生在子类与父类之间、子类重写父类的方法具有相同的返回类型、更好的访问权限,简而言之:就是具体的实现类对于父类的该方法实现不满意,需要自己在写一个满足于自己要求的方法。
有以下几点:
-
方法名必须相同,返回值类型必须相同(可以不同的,见说明),参数列表必须相同;
说明:自JDK1.5之后的版本,返回值也可以不同,但是必须是父类返回值的子类,其中涉及到了 java 中的"语法糖",即在将 *.java 编译为 *.class过程中,进行了一些自动转换,本质上生成了一种桥接方法
synthetic bridge
,在此不进行具体展开,后续关于JVM的笔记中会补充说明 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 在
public
,那么在子类中重写该方法就不能声明为protected
。-
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private、final、static 的方法。
static:重载是基于运行时的多态,而static方法是编译时静态绑定的,static 方法跟类的任何实例都不相关,所以概念上不适用。
静态方法:静态的方法可以被继承,但是不能重写。如果父类和子类中存在同样名称和参数的静态方法,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法也不再存在多态的性质。
构造方法不能被重写。
总结
重载(Overloading) | 重写(Overriding) | |
---|---|---|
类的数量 | 本类 | 父子类、接口与实现类 |
方法名称 | 一致 | 一致 |
参数列表 | 可以修改 | 不能修改 |
返回值类型 | 可以修改 | 可以修改,但必须是父类返回值的子类 |
访问修饰符 | 可以修改 | 可以修改,但不能比父类的访问权限低 |
异常 | 可以修改 | 可以减少或删除,但不能扩展 |