4、重载和重写
结合以上两个章节的内容,总结一下重载(overload
) 和 重写(override
)的区别。
重载和重写都是多态的实现方式。
多态有两种:
编译时多态
也就是所谓的重载,根据参数,选择执行不同的方法体。
运行时多态
也就是所谓的重写。
# 重载
eg:
public class Car {
private String carName;
public Car(String carName) {
this.carName = carName;
}
public void printCarName() {
System.out.println("车的名字:" + this.carName);
}
protected void printCarName(int carAge) {
System.out.println("车的名字:" + this.carName + ",车龄:" + carAge);
}
protected String printCarName(int carAge, int kilometre) {
System.out.println("车的名字:" + this.carName + ",车龄:" + carAge + ",公里数:" + kilometre);
return "";
}
}
class HaC {
public static void main(String[] args) {
Car car = new Car("AE86");
car.printCarName();
car.printCarName(3);
car.printCarName(3, 100000);
}
}
输出:
车的名字:AE86
车的名字:AE86,车龄:3
车的名字:AE86,车龄:3,公里数:100000
printCarName()
就是重载了,有三种不同的参数列表。
重载规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
无法以返回值类型作为重载函数的区分标准!
# 重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写。
重写必须建立在继承基础上,返回值和形参都不能改变。
eg:
public class Car {
void drive() {
System.out.println("开车");
}
}
class WuLingHongGuang extends Car {
@Override
void drive() {
System.out.println("开五菱宏光");
}
}
子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
子类可使用super
关键字,该关键字引用了当前类的父类。
重写规则:
- 参数列表与被重写方法的参数列表必须完全相同
- 子类函数的访问修饰权限不能少于父类,例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected
- 声明为
final
的方法不能被重写,声明为static
的方法不能被重写,但是能够被再次声明 - 构造方法不能被重写
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
上次更新: 2025-02-21 06:04:57