Java虚拟方法调用的用途是什么?
我了解什么是java方法调用,并使用它实践了许多示例 我想知道这个概念的实际情况或需要是什么。 如果有人能给出一个真实的场景,说明它在哪里被使用和使用,那将是非常有帮助的Java虚拟方法调用的用途是什么?,java,oop,virtual-functions,Java,Oop,Virtual Functions,我了解什么是java方法调用,并使用它实践了许多示例 我想知道这个概念的实际情况或需要是什么。 如果有人能给出一个真实的场景,说明它在哪里被使用和使用,那将是非常有帮助的 如果没有这个概念,会发生什么呢?下面是一个例子。假设我们有两个类: class A { public String getName() { return "A"; } } class B extends A { public String getName() { ret
如果没有这个概念,会发生什么呢?下面是一个例子。假设我们有两个类:
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没有虚拟方法调用
,它将在编译时确定要调用的getName()
是属于A
类的。因为它没有,但是在运行时根据myA
指向的实际类来确定,所以我们得到了上面的结果
[编辑以添加(稍微做作的)示例]您可以使用此功能编写一个方法,该方法将任意数量的
对象
作为参数,并按如下方式打印它们:
public void printObjects(Object... objects) {
for (Object o: objects) {
System.out.println(o.toString());
}
}
这将适用于任何对象的混合。如果Java没有
虚拟方法调用
,那么所有对象都将使用对象的toString()
打印,因为它的可读性不强。现在,将使用每个实际类的toString()
,这意味着打印输出通常更具可读性。好的,我将尝试提供一个简单的示例。您正在编写一个方法,该方法将填充调用方提供的列表:
public void fill(List l) {
list.add("I just filled the list!");
}
现在,一个调用方希望使用链接列表;另一个更喜欢基于数组的列表实现。还会有其他调用者使用您从未听说过的更多列表实现。这些是完全不同的对象。提出一个解决方案,实现这一点而不依赖虚拟方法
如果没有虚拟方法,这意味着类型List
将需要实现方法add
。即使您的子类型ArrayList
具有重写的方法,编译器(和运行时!)也会忽略该方法,并使用列表中的方法。不可能使用符合相同接口的不同列表
实现;在方法fill
中不可能重用该行代码,因为它只能与类型列表中的方法一起使用
你看,类型层次结构的整个概念没有多大意义<代码>接口
s和抽象类
es甚至不存在。如果没有虚拟方法这一特性,整个Java将分解成碎片。“实时场景”并不是你所想的那样。您感兴趣的是一个“真实世界场景”。如果没有这个概念,您就不会有使Java的OOP模型有价值的唯一特性——多态性。请看这里:您如何理解“Java虚拟方法调用”?一般来说,Java中不存在虚拟方法。@EJP我看到了您对另一个问题的答案。Java有相同的概念,只是使用了不同的名称。这些实现使用vtable
。因为这个问题不是关于术语,而是关于概念本身,说Java没有虚拟方法就等于说它没有方法分派;object.getName();-一个类对另一个类对象的引用有什么特殊之处?@Keppil你能举个例子(实时场景)来说明上面解释的情况吗?我很高兴有实际的情况来使用它们。我理解你的意思explanation@Meenakshi:如果我们有一个来自外部API的方法,该方法需要一个a
对象,并且将调用getName(),那么这非常有用。然后你可以给它一个B
,这样可以改变它的工作方式。正如@Vash所说,这叫做多态性,非常有用。非常感谢编辑示例,它澄清了很多概念