java 继承中的隐藏方法

hiding method in java inheritance

我有两个 class 如下:

public class Car {
    public static void print() {
        System.out.println(getWord());
    }

    public static String getWord() {
        return "CAR";
    } 
}

public class BMW extends Car {
    public static String getWord() {
        return "BMW";
    } 
}

// main method
public static void main(String args[]) {
    BMW.print();
}

在我 运行 上面的示例之后,打印了这个输出:

CAR

我的问题是:为什么方法 getWord() 没有被覆盖?

无法覆盖静态方法,因为方法覆盖仅发生在方法的动态(即运行时)查找上下文中。静态方法(按其名称)是静态查找的(即在编译时)。

在 Java 中:字段和 static 方法不遵守 dynamic/runtime 多态性。当您调用 BMW.print() 时,它会继承 Car 的静态定义。作为 static 函数调用,它指的是 Car.getWord()

当您调用 BMW.print() 时,class BMW 中的 getWord() 方法不会被调用,因为 static 方法与 class 关联,不是 class 的实例。调用 static 方法 BMW.print() 后,需要做几件事:

  • BMW.print() 进行的所有方法调用必须 static 方法,如果它们是在 BMW class 中定义的
  • 没有继承的概念,即调用 getWord() 方法不会传播到子 class。这样做的原因是 getWord() 是与 Car class 本身关联的 static 方法。

如果您真的想让当前代码打印 "BMW",您可以尝试以下方法(这不是很好的设计):

public class Car {
    public static void print() {
        System.out.println(BMW.getWord());
    }

    public static String getWord() {
        return "CAR";
    } 
}

根据静态方法的特点,

  1. 我们不能覆盖静态方法。
  2. 如果一个方法是静态的并且您在继承的 class 中声明相同的方法与基 class 相同,则它不会被隐藏。

请检查 Java 文档中的以下规则:

重写:Java 中的重写只是意味着将根据对象的 运行 时间类型调用特定方法,而不是根据它的编译时类型(情况就是这样)使用覆盖的静态方法)

隐藏:静态的父 class 方法不是子 class 的一部分(尽管它们是可访问的),因此不存在覆盖它的问题。即使您在 subclass 中添加另一个静态方法,与其父 class 中的静态方法相同,这个 subclass 静态方法也是唯一的,并且不同于其父 class 中的静态方法=26=].