重写和重载的区别
一、重写
1.重写的定义
重写(Override)是指子类重新定义父类中已有的方法,使得子类可以根据自己的需要对父类的方法进行重新实现。重写方法的名称、参数类型和个数以及返回值类型都必须与父类中被重写的方法一致。
2.代码示例
class Animal {
public void sound() {
System.out.println("动物发出声音");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("猫发出“喵喵”声");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
animal.sound();
Cat cat = new Cat();
cat.sound();
}
}
3.重写规则
1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的
//伪代码
class Animal {
public Animal sound() {
System.out.println("动物发出声音");
}
}
class Cat extends Animal {
@Override
public Cat sound() {
System.out.println("猫发出“喵喵”声");
}
}
3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected
4.父类被static、private修饰的方法、构造方法都不能被重写
5.重写的方法, 可以使用 @Override 注解来显式指定.,用来进行一些合法性校验。比如上面的示例代码中,将sound写成sond,这个时候编译器就提醒写错了
6.子类中的重写方法不能抛出新的异常
二、重载
1. 重载的定义
重载(Overload)是指在同一个类中定义多个方法,它们具有相同的名称但是参数列表不同。重载方法的参数类型、个数或者顺序必须不同。
2. 代码示例
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
System.out.println(calculator.add(1, 2));
System.out.println(calculator.add(1.2, 2.3));
}
}
3.重载规则
1.方法的参数表必须不同,包括参数的类型或个数,以此区别不同的方法体
如代码示例:
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
2.方法的返回类型,修饰符可以相同也可以不同
总结
区别点 | 重写(override) | 重载(override) |
---|---|---|
参数列表 | 一定不能修改 | 必须修改 |
返回类型 | 一定不能修改(除非可以构成父子类关系) | 可以修改 |
访问限定符 | 可以扩大访问权限,但是不能降低 | 可以修改 |