【问题标题】:Polymorphism and inheritance in Java with static methods of abstract classJava中的多态和继承与抽象类的静态方法
【发布时间】:2018-09-10 03:27:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 感谢您的快速接受!

标签: java inheritance polymorphism static-methods


【解决方案1】:

静态方法没有多态性。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 2012-12-03
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 2014-11-30
      • 2011-04-02
      • 2011-08-05
      • 1970-01-01
      相关资源
      最近更新 更多