java继承中的隐藏方法

时间:2015-09-29 09:04:05

标签: java oop static-methods method-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() {
        return "BMW";
    } 
}

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

运行上面的示例后,打印此输出:

  

CAR

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

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

getWord()调用BMW时,调用BMW.print()类中的static方法,因为class方法与static相关联,而不是类。在您调用BMW.print()方法BMW.print()后,需要执行以下操作:

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

如果你真的想让你当前的代码打印public class Car { public static void print() { System.out.println(BMW.getWord()); } public static String getWord() { return "CAR"; } } ,你可以尝试以下(这不是很好的设计):

   $('#view-tags').click(function(){
        $('li[data-value]').each(function(){
        var value = $(this).attr('data-value');
            alert(value);
        })
}); // this work normally

答案 3 :(得分:1)

根据静态方法的特点,

  1. 我们无法覆盖静态方法。
  2. 如果方法是静态的,并且在继承的类中声明与基类相同的方法,则不会隐藏它。
  3. 请查看以下来自Java Doc的规则:

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

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

相关问题