Java中的多态性和继承与抽象类的静态方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的多态性和继承与抽象类的静态方法相关的知识,希望对你有一定的参考价值。

我在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?
    }
 }

正确的答案是调用抽象类的方法。

现在,我的理解是在多态性中,如果父类的变量包含对子类对象的引用,那么将调用子类的方法。

因此,我理解正确的情况是,在静态函数的情况下,将调用其变量包含refrence的类的方法?

答案

静态方法没有多态性。

编译器在编译时决定调用哪个方法。

它看到w是一个Writer,它既不知道也不关心实际实例在运行时是否属于该特定子类。编译器有时可以知道它,但Java在这里采取了简单的方法。

这就是为什么在实际生产代码中使用静态方法非常小心的原因之一:这样做意味着牺牲OOP的一个基本元素。

另一答案

不,你不能覆盖子类中的静态方法,因此没有方法的多态运行时查找。静态方法与类的实例字段/方法没有交互,因此调用依赖于特定实例/子类的静态方法是没有意义的。

将静态方法视为实用程序/库方法更容易。它们只是出于组织目的而包含在类中。

以上是关于Java中的多态性和继承与抽象类的静态方法的主要内容,如果未能解决你的问题,请参考以下文章

面向对象(封装继承多态抽象)

类的相关知识(封装继承多态方法构造方法接口抽象类静态方法静态变量等)

java学习笔记3(datawhale教程)

详细的解释下类的封装性,抽象性,继承性和多态性。

Python中静态方法和类方法的区别

Java语法包 继承 多态 抽象类 接口