重写发生在父子类中,子类重写父类(抽象类/接口)的方法,达到解耦的目的。
但是当被重写的方法被static修饰时(无论父类是否抽象),子类继承了父类的方法之后,不会重写。
例如:
public class OverrideDemo {
public static void main(String[] args) {
A pra = new B();
pra.say();
}
}class A {public static void say(){System.out.println("A");}}class B extends A{public static void say(){System.out.println("B");}}
此时的输出结果是:
B
但是,如果是子类类型引用指向子类类型对象时,会发现调用的还是子类的静态方法。
public static void main(String[] args) {
B pra = new B();
pra.say();
}
此时的输出结果是:
A
由此可以发现,当被子类的静态方法的签名和被继承的静态方法签名相同时,向上造型后子类对象只能调用父类静态方法,看起来是不符合面向对象的多态属性。
静态方法是属于类的,静态方法无法被覆盖。子类无法覆盖父类方法时,就不属于多态。
例如 A a = new B();可以翻译为,一个A类型引用a指向B类型对象。所以它还是属于父类类型,调用的静态方法也就是父类的。