java 继承中的隐藏方法
hiding method in java inheritance
我有两个 class 如下:
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()
没有被覆盖?
无法覆盖静态方法,因为方法覆盖仅发生在方法的动态(即运行时)查找上下文中。静态方法(按其名称)是静态查找的(即在编译时)。
在 Java 中:字段和 static
方法不遵守 dynamic/runtime 多态性。当您调用 BMW.print()
时,它会继承 Car
的静态定义。作为 static
函数调用,它指的是 Car.getWord()
当您调用 BMW.print()
时,class BMW
中的 getWord()
方法不会被调用,因为 static
方法与 class
关联,不是 class 的实例。调用 static
方法 BMW.print()
后,需要做几件事:
- 从
BMW.print()
进行的所有方法调用必须 也 是 static
方法,如果它们是在 BMW
class 中定义的
- 没有继承的概念,即调用
getWord()
方法不会传播到子 class。这样做的原因是 getWord()
是与 Car
class 本身关联的 static
方法。
如果您真的想让当前代码打印 "BMW"
,您可以尝试以下方法(这不是很好的设计):
public class Car {
public static void print() {
System.out.println(BMW.getWord());
}
public static String getWord() {
return "CAR";
}
}
根据静态方法的特点,
- 我们不能覆盖静态方法。
- 如果一个方法是静态的并且您在继承的 class 中声明相同的方法与基 class 相同,则它不会被隐藏。
请检查 Java 文档中的以下规则:
重写:Java 中的重写只是意味着将根据对象的 运行 时间类型调用特定方法,而不是根据它的编译时类型(情况就是这样)使用覆盖的静态方法)
隐藏:静态的父 class 方法不是子 class 的一部分(尽管它们是可访问的),因此不存在覆盖它的问题。即使您在 subclass 中添加另一个静态方法,与其父 class 中的静态方法相同,这个 subclass 静态方法也是唯一的,并且不同于其父 class 中的静态方法=26=].
我有两个 class 如下:
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()
没有被覆盖?
无法覆盖静态方法,因为方法覆盖仅发生在方法的动态(即运行时)查找上下文中。静态方法(按其名称)是静态查找的(即在编译时)。
在 Java 中:字段和 static
方法不遵守 dynamic/runtime 多态性。当您调用 BMW.print()
时,它会继承 Car
的静态定义。作为 static
函数调用,它指的是 Car.getWord()
当您调用 BMW.print()
时,class BMW
中的 getWord()
方法不会被调用,因为 static
方法与 class
关联,不是 class 的实例。调用 static
方法 BMW.print()
后,需要做几件事:
- 从
BMW.print()
进行的所有方法调用必须 也 是static
方法,如果它们是在BMW
class 中定义的 - 没有继承的概念,即调用
getWord()
方法不会传播到子 class。这样做的原因是getWord()
是与Car
class 本身关联的static
方法。
如果您真的想让当前代码打印 "BMW"
,您可以尝试以下方法(这不是很好的设计):
public class Car {
public static void print() {
System.out.println(BMW.getWord());
}
public static String getWord() {
return "CAR";
}
}
根据静态方法的特点,
- 我们不能覆盖静态方法。
- 如果一个方法是静态的并且您在继承的 class 中声明相同的方法与基 class 相同,则它不会被隐藏。
请检查 Java 文档中的以下规则:
重写:Java 中的重写只是意味着将根据对象的 运行 时间类型调用特定方法,而不是根据它的编译时类型(情况就是这样)使用覆盖的静态方法)
隐藏:静态的父 class 方法不是子 class 的一部分(尽管它们是可访问的),因此不存在覆盖它的问题。即使您在 subclass 中添加另一个静态方法,与其父 class 中的静态方法相同,这个 subclass 静态方法也是唯一的,并且不同于其父 class 中的静态方法=26=].