在 Java 中,静态方法不能被重写,但可以被隐藏。如果你尝试在子类中“重写”父类的静态方法,实际上只是隐藏了父类的静态方法,而不是重写。

具体情况

  1. 静态方法属于类,而不是实例

    • 静态方法与类绑定,不与对象的实例绑定。这意味着静态方法在编译时由类名调用,而不是通过多态性机制调用。
    • 因此,子类中的静态方法无法像实例方法那样通过多态性重写父类的静态方法。
  2. 方法隐藏

    • 当子类中定义了与父类相同签名的静态方法时,子类中的静态方法隐藏了父类的静态方法。这不是重写,而是仅在调用时根据引用的类型调用不同的静态方法。
    • 父类的静态方法在使用父类的引用类型时仍然可以访问。

其实就是按照类型直接调用对应的方法,这里都爆提示说明要用静态的方式来访问静态方法,这样就能够减少判断失误了(静态方法和 new 那些之前的动作无关,只和调用那一刻的类型有关)

示例代码

class Parent {
    // 父类的静态方法
    public static void staticMethod() {
        System.out.println("Parent static method");
    }
 
    // 父类的实例方法
    public void instanceMethod() {
        System.out.println("Parent instance method");
    }
}
 
class Child extends Parent {
    // 子类隐藏父类的静态方法
    public static void staticMethod() {
        System.out.println("Child static method");
    }
 
    // 子类重写父类的实例方法
    @Override
    public void instanceMethod() {
        System.out.println("Child instance method");
    }
}
 
public class TestStaticOverride {
    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent childAsParent = new Child();
        Child child = new Child();
 
        // 调用静态方法
        parent.staticMethod();       // 输出: Parent static method
        childAsParent.staticMethod(); // 输出: Parent static method (静态方法不会表现出多态性)
        child.staticMethod();         // 输出: Child static method
 
        // 调用实例方法
        parent.instanceMethod();      // 输出: Parent instance method
        childAsParent.instanceMethod(); // 输出: Child instance method (实例方法表现出多态性)
        child.instanceMethod();        // 输出: Child instance method
    }
}

输出结果

Parent static method
Parent static method
Child static method
Parent instance method
Child instance method
Child instance method

解释:

  1. 静态方法的隐藏

    • parent.staticMethod() 调用了 Parent 类的静态方法,输出 “Parent static method”。
    • childAsParent.staticMethod() 仍然调用了 Parent 类的静态方法,即使 childAsParentChild 类的对象。这是因为静态方法调用与引用类型Parent)绑定,而不是运行时的实际对象类型。
    • child.staticMethod() 调用了 Child 类的静态方法,因为它的引用类型是 Child
  2. 实例方法的多态性

    • 在调用实例方法时,Java 会根据实际的对象类型决定调用哪一个方法,这就是多态性
    • childAsParent.instanceMethod() 实际上是 Child 类的对象,因此调用了 Child 类的 instanceMethod()

结论

  • 静态方法不能被重写,只能被隐藏。在子类中定义与父类同名的静态方法时,调用时依赖于引用类型,而不是运行时的对象类型。
  • 实例方法可以被重写,并且会根据运行时对象的类型表现出多态性。

因此,即使你尝试强制“重写”静态方法,Java 依然不会表现出多态性,而是通过隐藏来处理静态方法。