Java基础之 静态方法不能重写解析

Java的静态方法有一条规则:静态方法不能重写。

我们先来看一个demo:

public class AParent {

    public void test(String s) {
        System.out.println("输入参数为:" + s);
    }
}

public class BChild extends AParent{

    public void test(String s) {
        System.out.println("输入参数为:" + s);
    }
}

public class TestClient {

    public static void main(String[] args) {
        BChild bc = new BChild();
        bc.test("a");
    }
}
/*
输入参数为:a
*/

父类AParent的test方法是一个非静态方法,此时子类BChild重写父类方法是没有问题的,我们来修改一下父类的方法,将其修改为静态方法:static test()

public class AParent {

    public void test(String s) {
        System.out.println("输入参数为:" + s);
    }
}

public class BChild extends AParent{

	/**
     * 编译器报错:Instance method 'test(String)' in 'BChild' cannot override static method 'test(String)' in 'AParent'
     */
    public static void test(String s) {
        System.out.println("输入参数为:" + s);
    }
}

public class TestClient {

    public static void main(String[] args) {
        BChild bc = new BChild();
        bc.test("a");
    }
}

这种情况如何修改呢?我们只需要把子类BChild的test方法也加上static就可以了。
那么为什么会有这样的机制呢?方法重写的目的是实现了Java中的一个特性:多态,多态是有继承有重写的情况下基于对象的一个动态方法选择机制,如果一个类的方法是静态方法,那么就可以通过类.方法名直接引用了,且不用创建对象。


如果Java支持了重写静态方法,想象一下,父类有一个静态方法,子类有一个非静态的重写父类的方法,父类的静态方法可以直接调用,子类方法却需要new对象再调用,此时我如果使用子类.方法名,子类的方法是非静态的,这会报错,这本身就完全背离了多态机制,所以Java如果提供了这种功能,是明显的多余和错误的机制。