java继承中的隐藏方法

java继承中的隐藏方法,java,oop,static-methods,overriding,method-hiding,Java,Oop,Static Methods,Overriding,Method Hiding,我有两个班,如下所示: 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() {

我有两个班,如下所示:

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();
}
运行上述示例后,将打印此输出:

汽车


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

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

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

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

  • BMW.print()
    进行的所有方法调用如果在
    BMW
    类中定义,则也必须是
    static
    方法
  • 没有继承的概念,即调用
    getWord()
    方法不会传播到子类。原因是
    getWord()
    是一个与
    Car
    类本身相关联的
    static
    方法
如果您真的想让当前代码打印“BMW”,您可以尝试以下方法(这不是很好的设计):


根据静态法的特点,

  • 我们不能覆盖静态方法
  • 如果一个方法是静态的,并且您在继承的类中声明了相同的方法,并且基类的as相同,那么它将不会被隐藏
  • 请检查Java文档中的以下规则:

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


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

    您的方法是
    static
    Car.print
    references
    Car.getWord
    OP谈论的是“方法隐藏”,不重写。正如tim在下面提到的,如果你想隐藏print()方法,那么你可以将该方法设置为私有访问。你不需要向我解释,而是应该将其添加到你的答案中,以便OP可以阅读。另外,如果你在编辑中使用了Tim的部分答案,也不要忘记将其归功于Tim的答案。现在更新问题之后。我的答案很好:)是的,因为有人将“隐藏”改为“覆盖”,而有些评论员不关心正确的评议:(。
    public class Car {
        public static void print() {
            System.out.println(BMW.getWord());
        }
    
        public static String getWord() {
            return "CAR";
        } 
    }