方法覆盖是子类型重新定义(覆盖)其超类型的行为的能力。
在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)
我们无法覆盖最终方法或静态方法。能做的唯一的事情只改变方法主体。