Java 虚拟方法调用有什么用?[已关闭]

2022-09-03 13:07:10

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

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


答案 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 invocationgetName()AmyA

[EDIT 以添加(略微人为的)示例]
您可以使用此功能编写一个方法,该方法将任意数量的 s 作为参数并按如下方式打印它们:Object

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

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


答案 2

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

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

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

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

所以你看,类型层次结构的整个想法没有多大意义。s 和 es 甚至不可能存在。整个Java将分解成没有虚拟方法的一个特征的分片。interfaceabstract class