Java 中的多态性和继承与抽象 class 的静态方法
Polymorphism and inheritance in Java with static methods of abstract class
我正在浏览 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?
}
}
正确答案是调用抽象class的方法。
现在,我的理解是,在多态性中,如果父类型class的变量包含对子class对象的引用,那么子class的方法将被调用。
因此,我的理解是否正确,如果是静态函数,将调用变量包含引用的 class 的方法?
不,您不能在子class 中覆盖静态方法,因此没有该方法的多态运行时查找。静态方法与 class 的实例 fields/methods 没有交互,因此调用依赖于特定 instance/subclass 的静态方法是没有意义的。
更容易将静态方法视为 utility/library 方法。它们包含在 classes 中只是为了组织的目的。
静态方法没有多态性。
编译器在编译时决定调用哪个方法。
它看到 w 是一个 Writer,它既不知道也不关心实际实例在运行时将属于那个特定的子 class。编译器有时可能知道,但 Java 在这里选择了简单的路径。
这就是您在实际生产代码中非常小心使用静态方法的原因之一:这样做意味着牺牲 OOP 的基本元素之一。
我正在浏览 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?
}
}
正确答案是调用抽象class的方法。
现在,我的理解是,在多态性中,如果父类型class的变量包含对子class对象的引用,那么子class的方法将被调用。
因此,我的理解是否正确,如果是静态函数,将调用变量包含引用的 class 的方法?
不,您不能在子class 中覆盖静态方法,因此没有该方法的多态运行时查找。静态方法与 class 的实例 fields/methods 没有交互,因此调用依赖于特定 instance/subclass 的静态方法是没有意义的。
更容易将静态方法视为 utility/library 方法。它们包含在 classes 中只是为了组织的目的。
静态方法没有多态性。
编译器在编译时决定调用哪个方法。
它看到 w 是一个 Writer,它既不知道也不关心实际实例在运行时将属于那个特定的子 class。编译器有时可能知道,但 Java 在这里选择了简单的路径。
这就是您在实际生产代码中非常小心使用静态方法的原因之一:这样做意味着牺牲 OOP 的基本元素之一。