方法重写
方法重写是子类型重新定义(覆盖)其超类型行为的能力。
在 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 方法。只有我们可以做的事情只改变方法体。