我明白了什么是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
类。 因为它没有,而是取决于实际的类在运行时确定该myA
指出,我们得到了上述结果。
[编辑以添加(略做作)示例]
您可以使用此功能来编写接受任何数量的方法Object
S作为参数,并将它们打印这样的:
public void printObjects(Object... objects) {
for (Object o: objects) {
System.out.println(o.toString());
}
}
这将为对象的任何组合的工作。 如果爪哇没有virtual method invocation
时,所有对象将使用Object's被印刷toString()
这是不是很可读。 现在代替,所述toString()
的每个实际的类将被使用,这意味着打印输出通常将是更具有可读性。
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会分解为碎片无虚方法是一个功能。