Java方法覆盖

示例

方法覆盖是子类型重新定义(覆盖)其超类型的行为的能力。

在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)

  • 我们无法覆盖最终方法或静态方法。能做的唯一的事情只改变方法主体。