方法重写

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

在 Java 中,这转换为子类重写超类中定义的方法。在 Java 中,所有非原始变量实际上都是 references,它们类似于指向内存中实际对象位置的指针。references 只有一种类型,这是它们声明的类型。但是,它们可以指向其声明类型或其任何子类型的对象。

当在 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 {
    // override the superclass method
    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

        // make the reference point to an object of the subclass
        superType = new SubType();
        // behaviour is governed by the object, not by the reference
        superType.sayHello(); // -> Hello from SubType

        // non-overridden method is simply inherited
        superType.sayBye(); // -> Bye from SuperType
    }
}

要记住的规则

要覆盖子类中的方法,重写方法(即子类中的方法) 必须具有

  • 一样的名字
  • 在基元的情况下相同的返回类型(类允许子类,这也称为协变返回类型)。
  • 相同类型和顺序的参数
  • 它可能只抛出在超类的方法的 throws 子句中声明的那些异常,或者抛出作为声明的异常的子类的异常。它也可以选择不抛出任何异常。参数类型的名称无关紧要。例如,void methodX(int i)与 void methodX(int k)相同
  • 我们无法覆盖 final 或 Static 方法。只有我们可以做的事情只改变方法体。