我有以下两个课程:
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()
没有覆盖?
答案 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)
根据静态方法的特点,
请查看以下来自Java Doc的规则:
覆盖:在Java中覆盖只是意味着将根据对象的运行时类型调用特定方法,而不是根据它的编译时类型调用(覆盖静态方法就是这种情况)
隐藏:静态的父类方法不是子类的一部分(尽管它们是可访问的),因此不存在覆盖它的问题。即使在子类中添加另一个静态方法,与其父类中的静态方法相同,此子类静态方法也是唯一的,与其父类中的静态方法不同。