方法重载和方法重载的区别以及方法重写的原理
程序员文章站
2024-03-16 22:21:52
...
一、重写和重载
1、重载(overload):
方法重载是指同一个类中的多个方法具有相同的名字
方法名 | 相同 |
---|---|
参数列表 | 不同 |
返回类型 | 可以相同也可以不相同 |
无法以返回型别作为重载函数的区分标准 | |
重载是发生在编译时的,因为编译器可以 根据参数的类型来选择使用那个方法 |
2、重写(override):
方法重写是存在子父类之间的
方法名 | 相同 |
---|---|
参数列表 | 相同 |
返回值类型 | 可以相同也可以是原类型的子类型 |
访问性 | 比父类被重写方法更好访问 |
异常 | 不能比父类被重写方法声明更多的异常(里氏代换原则) |
final | 被final修饰的方法不能重写 |
prvate | 被private修饰的不能重写 |
static | 被static修饰的不能重写 |
抽象类和接口的方法必须要重写 | |
重写发生在运行时,因为编译期编译器不知道并且没办法确定该去调用哪个方法,JVM会在代码运行的时候做出决定。 |
3、重载和重写的不同:
重载 | 重写 | |
---|---|---|
使用条件 | 同一类 | 继承关系,子类中 |
参数列表 | 不同 | 相同 |
返回类型 | 可同可不同 | 可以相同也可以是原类型的子类型 |
访问权限 | 无要求 | 有特殊要求,见规则 |
次数限制 | 重载多次 | 父类方法只能被子类重写一次 |
作用时间 | 编译期 | 运行期 |
二、方法重写的原理
class Shape{
void getArea(){//面积
System.out.println("长*宽");
}
void getCir(){//周长
}
}
class Circle extends Shape{
@Override
void getArea(){
System.out.println("长*宽");
}
class TestDemo{
public static void main (String[] args){
Circle circle = new Circle();
circle.getArea();
}
}
方法重写的原理:方法区中的地址覆盖