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
根据静态法的特点,
隐藏:静态的父类方法不是子类的一部分(尽管它们是可访问的),因此不存在重写它的问题。即使您在子类中添加了另一个与其父类中的静态方法相同的静态方法,该子类静态方法也是唯一的,并且与其父类中的静态方法不同。您的方法是
static
,Car.print
referencesCar.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";
}
}