1.重写一个方法,即在子类中完全取代它的功能,重写后的方法必须和父类中的被替代方法拥有完全一致的方法签名,包括返回值。
2.static修饰的方法不能被重写,下面看一个容易被误解为static方法被重写的例子
class Base {
static void aMethod() {
System.out.println("Base.aMethod");
}
}
public class Cravengib extends Base {
public static void main(String[] args) {
Cravengib c = new Cravengib();
c.aMethod();
Base b = new Cravengib();
b.aMethod();
}
static void aMethod() {
System.out.println("Cravengib.aMethod");
}
}
输出结果:Cravengib.aMethod
Base.aMethod
从结果我们可以看出,static 方法与类关联,而不是与特定的类的实例相关联,它不在意什么类型的类正在创建它,而仅仅在意引用的类型。
b是一个类Cravengib在内存中的一个Base类型的实例的引用,如果一个static方法被调用了JVM不会检查什么类型正在指向它,而只会调用跟Base类相关联的的方法的实例。
再来看一个正确的方法重写例子:
class Base {
void aMethod() {
System.out.println("Base.aMethod");
}
}
public class Cravengib extends Base {
public static void main(String[] args) {
Cravengib c = new Cravengib();
c.aMethod();
Base b = new Cravengib();
b.aMethod();
}
void aMethod() {
System.out.println("Cravengib.aMethod");
}
}
输出结果:Cravengib.aMethod
Cravengib.aMethod
从输出结果看到语句:b.aMethod();执行的是子类中的aMethod方法体,即子类中的方法完全替代了父类中被重写的方法