方法覆盖是子类型重新定义(覆盖)其超类型的行为的能力。
在Java中,这会转换为子类,从而覆盖超类中定义的方法。在Java中,所有非基本变量实际上references都是,类似于指向实际对象在内存中位置的指针。在references只有一个类型,这是他们被宣布与类型。但是,它们可以指向其声明类型或其任何子类型的对象。
在a上调用方法时,将调用指向实际对象reference的相应方法。
class SuperType {
public void sayHello(){
System.out.println("Hello from SuperType");
}
public void sayBye(){
System.out.println("Bye from SuperType");
}
}
class SubType extends SuperType {
// 覆盖超类方法
public void sayHello(){
System.out.println("Hello from SubType");
}
}
class Test {
public static void main(String... args){
SuperType superType = new SuperType();
superType.sayHello(); // -> Hello from SuperType
// 使引用指向子类的对象
superType = new SubType();
// 行为由对象而不是引用控制
superType.sayHello(); // -> Hello from SubType
// 非重写方法只是继承
superType.sayBye(); // -> Bye from SuperType
}
}要牢记的规则
要覆盖在子类的方法,该方法重写(即,一个在子类)必须有:
一样的名字
如果是原语,则返回类型相同(类允许使用子类,这也称为协变返回类型)。
相同类型和顺序的参数
它只能抛出在超类的方法的throws子句中声明的那些异常,或者是所声明的异常的子类的异常。它还可以选择不引发任何异常。参数类型的名称无关紧要。例如,voidmethodX(int i)与void相同methodX(int k)
我们无法覆盖最终方法或静态方法。能做的唯一的事情只改变方法主体。