Java虚方法调用有什么用?

Mee*_*shi 13 java oop virtual-functions

我理解什么是java方法调用,并使用它练习了很多例子.

我想知道这个概念的实际情况或需要是什么.如果有人能够提供一个使用它的现实世界场景以及如果这个概念不存在会发生什么,那将是非常有帮助的?

Kep*_*pil 19

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

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

class B extends A {
    public String getName() {
        return "B";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我们得到了结果

B
Run Code Online (Sandbox Code Playgroud)

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

[编辑添加(稍加设计)示例]
您可以使用此功能编写一个方法,将任意数量的Objects作为参数并打印出来,如下所示:

public void printObjects(Object... objects) {
  for (Object o: objects) {
    System.out.println(o.toString());
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Meenakshi:如果我们有一个来自外部 API 的方法需要一个 `A` 对象并且将调用 getName(),这将非常有用。然后你可以给它一个`B`,这样就改变了它的工作方式。正如@Vash 所说,这称为多态性,并且非常有用。 (2认同)