【问题标题】:hiding method in java inheritancejava继承中的隐藏方法
【发布时间】:2015-12-26 16:45:36
【问题描述】:

我有两个类如下:

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() 没有被覆盖?

【问题讨论】:

  • 你的方法是staticCar.print引用Car.getWord

标签: java oop static-methods overriding method-hiding


【解决方案1】:

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

【讨论】:

  • OP 是在谈论“方法隐藏”,而不是覆盖。
  • 如下 tim 所说,如果要隐藏 print() 方法,则可以使该方法具有私有访问权限。
  • 您不要向我解释,而是应该将其添加到您的答案中,以便 OP 可以阅读。如果您在编辑中使用他的部分答案,也不要忘记记下 Tims 的答案。
  • 现在问题更新后。我的回答很好:)
  • 是的,因为有人将“隐藏”更改为“覆盖”,严重的是,一些评论者不关心正确评论:(。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      根据静态方法的特点,

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 2011-04-18
        • 1970-01-01
        • 2015-04-29
        • 2012-08-28
        • 1970-01-01
        • 2015-03-26
        相关资源
        最近更新 更多