Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java虚拟方法调用的用途是什么?_Java_Oop_Virtual Functions - Fatal编程技术网

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

我了解什么是java方法调用,并使用它实践了许多示例

我想知道这个概念的实际情况或需要是什么。 如果有人能给出一个真实的场景,说明它在哪里被使用和使用,那将是非常有帮助的
如果没有这个概念,会发生什么呢?

下面是一个例子。假设我们有两个类:

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所说,这叫做多态性,非常有用。非常感谢编辑示例,它澄清了很多概念