重写(Override)和重载(Overload)的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
所以重写就是方法内的逻辑改变,但方法名、参数列表、返回值类型等都不能变;而重载则是方法名不变,其他都可以变,其中参数列表必须改变。
总结:
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
- 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同;
- 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法。
举例
学习了这一节,我发现我在上一节“继承”中写的例子实际上就使用了重写和重载:
// 父类
public class Wolf {
private int age;
private double weight;
protected String name = "wolf";
public Wolf(int age) {
this.age = age;
}
public Wolf(int age, double weight) {
this(age);
this.weight = weight;
}
public void eat() {
System.out.println("Wolf: eat");
}
}
Wolf类中写了两个构造函数,它们的参数列表不同,这就是重载,体现了一个类的多态性;
// 子类
public class Dog extends Wolf {
protected String name = "dog";
public Dog(int age, double weight) {
super(age, weight); // 调用父类的构造方法
}
@Override
public void eat() {
System.out.println("Dog: eat");
}
public void eatTest() {
super.eat(); // 调用与父子同名的父类成员方法
this.eat();
}
public void printNameTest() {
System.out.println("Father's name: " + super.name);
System.out.println("My's name: " + name);
}
}
Dog类中也有一个eat方法,和它的父类Wolf的eat方法参数列表和返回值类型相同(都无),只是输出的具体内容不同,这就是重写,体现了父类和子类的多态性。并且,如eatTeat方法中所示,在子类中可以通过super关键字调用父类被重写的方法。
网友评论