use*_*888 3 java polymorphism inheritance static-methods
我正在阅读 Oracle 网站上 Java 8 Programmer I 考试的示例问题,并遇到以下问题:
abstract class Writer {
public static void write() {
System.out.println("Writing...");
}
}
class Author extends Writer {
public static void write() {
System.out.println("Writing book");
}
}
class Programmer extends Writer {
public static void write() {
System.out.println("Writing code");
}
public static void main(String[] args) {
Writer w = new Author();
w.write();//What would be the ouput here?
}
}
Run Code Online (Sandbox Code Playgroud)
正确答案是调用了抽象类的方法。
现在,我的理解是,在多态中,如果父类类型的变量包含对子类对象的引用,则将调用子类的方法。
因此,我是否理解在静态函数的情况下,将调用其变量包含引用的类的方法?
静态方法没有多态性。
编译器在编译时决定要调用哪个方法。
它看到 w 是一个 Writer,它既不知道也不关心实际实例在运行时是否属于该特定子类。编译器有时可能知道它,但 Java 在这里采用了简单的方法。
这就是您在实际生产代码中非常小心地使用静态方法的原因之一:这样做意味着牺牲 OOP 的基本要素之一。