【问题标题】:What is the use of Java virtual method invocation? [closed]Java虚方法调用有什么用? [关闭]
【发布时间】:2012-07-10 23:37:31
【问题描述】:

我了解什么是 java 方法调用,并使用它练习了许多示例。

我想知道这个概念的实际情况或需求是什么。 如果有人能给出一个使用它的真实世界场景,那将是非常有帮助的 如果没有这个概念会怎样?

【问题讨论】:

  • “实时场景”不是的意思是你认为的意思。您感兴趣的是“真实世界场景”。
  • 如果没有这个概念,您将不会拥有使 Java 的 OOP 模型有价值的唯一特性——多态性。
  • 如何理解“Java虚拟方法调用”?一般来说,Java 中不存在虚方法。
  • @EJP 我看到了你对另一个问题的回答。 Java具有相同的概念,只是使用了不同的名称。实现使用vtable。由于这个问题不是关于术语,而是关于概念本身,所以说 Java 没有虚拟方法就等于说它没有方法调度。

标签: java oop virtual-functions


【解决方案1】:

这是一个例子。假设我们有 2 个类:

class A {
    public String getName() {
        return "A";
    }
}

class B extends A {
    public String getName() {
        return "B";
    }
}

如果我们现在执行以下操作:

public static void main(String[] args) {
    A myA = new B();
    System.out.println(myA.getName());
}

我们得到结果

B

如果Java 没有virtual method invocation,它将在编译时确定要调用的getName() 是属于A 类的那个。由于它没有,而是在运行时根据myA 指向的实际类来确定这一点,所以我们得到了上述结果。

[编辑以添加(略微做作)示例]
您可以使用此功能编写一个方法,将任意数量的Objects 作为参数并像这样打印它们:

public void printObjects(Object... objects) {
  for (Object o: objects) {
    System.out.println(o.toString());
  }
}

这适用于任何对象组合。如果 Java 没有 virtual method invocation,则所有对象都将使用 Object´s toString() 打印,这不是很可读。现在,将使用每个实际类的toString(),这意味着打印输出通常更具可读性。

【讨论】:

  • 如果我们想打印'B',我们会调用 B object = new B();对象.getName(); - 是什么让一个类对不同类对象的引用特别?
  • @Keppil 你能举一个例子(实时场景)来展示上面解释的情况。我很高兴有我们使用它们的实际情况。你的解释我明白了
  • @Meenakshi:如果我们有一个来自外部 API 的方法需要 A 对象并调用 getName(),这将非常有用。然后你可以给它一个B,这样就改变了它的工作方式。正如@Vash 所说,这称为多态性,非常有用。
  • 非常感谢 EDIT 示例,它阐明了很多概念
【解决方案2】:

好的,我将尝试提供一个简单的示例。您正在编写一个方法来填充调用者提供的列表:

public void fill(List l) {
  list.add("I just filled the list!");
}

现在,一个调用者想要使用一个链表;另一个人更喜欢基于数组的列表实现。将会有其他调用者拥有更多你从未听说过的列表实现。这些是完全不同的对象。提出一个不依赖虚拟方法来实现这一目标的解决方案。

如果没有虚拟方法,这意味着List 类型已经需要实现add 方法。即使你有一个子类型ArrayList 有一个重写的方法,编译器(和运行时!)也会简单地忽略该方法并使用List 中的方法。 不可能使用符合相同接口的不同List 实现;在方法fill 中重用该行代码是不可能的,因为它只适用于List 类型的方法。

所以你看,类型层次的整个想法没有多大意义; interfaces 和 abstract classes 甚至都不存在。如果没有虚拟方法的这一特性,整个 Java 就会分解成碎片。

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2010-10-11
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多