Java虚方法调用有什么用?
我理解什么是java方法调用,并使用它练习了很多例子。
我想知道这个概念的实际情况或需要是什么。 如果有人能够提供一个使用它的现实世界场景以及如果这个概念不存在会发生什么,那将是非常有帮助的?
这是一个例子。 假设我们有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
类的getName()
。 因为它没有,但是在运行时根据myA
指向的实际类来myA
它,我们得到上面的结果。
[编辑添加(略有做作)的例子]
您可以使用此function编写一个方法,该方法将任意数量的Object
作为参数并打印出来,如下所示:
public void printObjects(Object... objects) { for (Object o: objects) { System.out.println(o.toString()); } }
这适用于任何对象组合。 如果Java没有virtual method invocation
,则将使用Object的toString()
打印所有对象,这些对象的可读性不高。 现在,将使用每个实际类的toString()
,这意味着打印输出通常更具可读性。
好的,我会尝试提供一个简单的例子。 您正在编写一个方法来填充调用者提供的列表:
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将分解为碎片。