在类继承里,子类可以修改从父类继承的方法,如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
被覆盖的方法在子类中只能通过super调用。
注意:覆盖不是删除父类方法,而是对子类的实例隐藏,暂时不使用。
例子:
public class Demo{
public static void main(String[] args) {
Dog myDog = new Dog("马大炮");
myDog.say(); // 子类的实例调用子类中的方法
Animal myAnmial = new Animal("牛大力");
myAnmial.say(); // 父类的实例调用父类中的方法
}
}
class Animal{
String name;
public Animal(String name){
this.name = name;
}
public void say(){
System.out.println("我是一头牛,我的名字叫" + name + ",我会走");
}
}
class Dog extends Animal{
// 构造方法不能被继承,通过super()调用
public Dog(String name){
super(name);
}
// 覆盖say() 方法
public void say(){
System.out.println("我是一匹马,我的名字叫" + name + ",我会跑");
}
}
运行结果:
我是一匹马,我的名字叫马大炮,我会跑
我是一头牛,我的名字叫牛大力,我会走
方法覆盖的原则:
1.覆盖方法没有原方法抛出更多的异常。
2.覆盖方法要比原方法访问性强(即访问权限不允许缩小)。
3.覆盖方法的返回类型、方法名称、参数列表必须与原方法的相同。
4.被覆盖的方法不能是final类型,因为final修饰的方法是无法覆盖的。
5.被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
覆盖和重载的不同:
1.方法覆盖要求返回类型必须一致,方法重载对此没有要求。
2.方法覆盖要求参数列表必须一致,而方法重载要求参数列表必须不一致。
3.父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
4.方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
5.方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。