15

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

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

4

2 回答 2

24

这是一个例子。假设我们有 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,所有对象都将使用不可读toString()的对象打印。现在,toString()将使用每个实际类的 ,这意味着打印输出通常更具可读性。

于 2012-07-11T11:07:27.537 回答
1

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

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

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

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

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

于 2012-07-11T11:22:45.547 回答