3

I have two class as following:

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();
}

After I run above sample, this output is printed:

CAR

My question is: Why is the method getWord() not overriden?

4

4 回答 4

7

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

于 2015-09-29T09:06:51.743 回答
2

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

于 2015-09-29T09:11:58.417 回答
2

调用时不会调用getWord()类中的方法,因为方法与 a 相关联,而不是类的实例。调用方法后,需要做几件事:BMWBMW.print()staticclassstaticBMW.print()

  • 如果在类中定义了所有方法调用,则它们BMW.print()必须是方法staticBMW
  • 没有继承的概念,即调用getWord()方法不会传播到子类。原因是这是与类本身关联getWord()的方法。staticCar

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

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

    public static String getWord() {
        return "CAR";
    } 
}
于 2015-09-29T09:12:28.150 回答
1

根据静态方法的特点,

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

请检查 Java Doc 中的以下规则:

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

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

于 2015-09-29T12:12:35.477 回答