Java 虚拟方法调用有什么用?[已关闭]
我了解什么是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
[EDIT 以添加(略微人为的)示例]
您可以使用此功能编写一个方法,该方法将任意数量的 s 作为参数并按如下方式打印它们:Object
public void printObjects(Object... objects) {
for (Object o: objects) {
System.out.println(o.toString());
}
}
这将适用于对象的任何组合。如果Java没有,所有对象都将使用Object's打印,这不是很可读。现在,将使用每个实际类的,这意味着打印输出通常更具可读性。virtual method invocation
toString()
toString()
好吧,我将尝试提供一个简单的示例。您正在编写一个将填充调用方提供的列表的方法:
public void fill(List l) {
list.add("I just filled the list!");
}
现在,一个调用方想要使用链表;另一个更喜欢基于数组的列表实现。将有其他调用方具有更多您从未听说过的列表实现。这些是完全不同的对象。提出一个解决方案,在不依赖虚拟方法的情况下实现这一目标。
如果没有虚拟方法,这意味着该类型已经需要实现该方法。即使您有一个子类型具有重写的方法,编译器(和运行时!)也会简单地忽略该方法并使用 中的方法。不可能使用符合同一接口的不同实现;在方法中重用该行代码是不可能的,因为它只能与类型中的方法一起使用。List
add
ArrayList
List
List
fill
List
所以你看,类型层次结构的整个想法没有多大意义。s 和 es 甚至不可能存在。整个Java将分解成没有虚拟方法的一个特征的分片。interface
abstract class