什么是使用Java虚拟方法调用的? [关闭](What is the use of Java v

2019-07-30 08:33发布

我明白了什么是Java方法调用,并实行使用它很多例子。

我想知道什么是实际情况或需要这个概念。 这将是很大的帮助,如果它是用来任何人都可以给出一个真实的场景,如果这个概念会不会在那里会发生什么?

Answer 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指出,我们得到了上述结果。

[编辑以添加(略做作)示例]
您可以使用此功能来编写接受任何数量的方法Object S作为参数,并将它们打印这样的:

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

这将为对象的任何组合的工作。 如果爪哇没有virtual method invocation时,所有对象将使用Object's被印刷toString()这是不是很可读。 现在代替,所述toString()的每个实际的类将被使用,这意味着打印输出通常将是更具有可读性。



Answer 2:

OK,我会尽力提供一个简单的例子。 您正在编写将填补调用方提供的列表的方法:

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

现在,一个呼叫者想要使用链表; 另一个更喜欢基于阵列中的列表实现。 还会有其他呼叫者与你从来没有听说过的更加列表实现。 这是完全不同的对象。 提出实现这个不依赖于虚拟方法的解决方案。

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

所以你看,类型层次的整体思路不会做出很大的意义; interface S和abstract class ES可能根本不存在。 整个Java会分解为碎片无虚方法是一个功能。



文章来源: What is the use of Java virtual method invocation? [closed]