为什么我们说Java中的静态方法不是虚方法?

在面向对象的范例中, 函数或虚方法是一种函数或方法,其行为可以通过具有相同签名的函数在inheritance类中重写,以提供多态行为


根据定义,除了final方法和私有方法之外,Java中的每个非静态方法都是默认的 方法 。 不能为多态行为inheritance的方法不是虚方法。


Java中的抽象类只不过是与C ++等效的纯虚方法。


为什么我们说Java中的静态方法不是虚方法? 即使我们可以覆盖静态方法,因此它可以提供多态性的一些优点,并且Java中的静态方法可以主要使用它的关联类名调用,但也可以使用它的关联类的对象来调用它。 Java与调用实例方法的方式相同。

不能覆盖静态方法。 它们在编译时受到约束。 它们不是多态的。 即使你试图调用它就好像它是一个实例方法(你不应该做IMO),它绑定到该表达式的编译时类型,并且完全忽略执行时间值(即使它为null) :

Thread otherThread = null; otherThread.sleep(1000); // No errors, equivalent to Thread.sleep(1000); 

这种行为对于读者来说可能非常混乱,这就是为什么至少某些 IDE允许您生成警告或错误以“通过”引用访问静态成员。 这是Java设计中的一个缺陷,纯粹而简单 – 但它根本不会使静态方法成为虚拟。

这很简单,静态方法不能被inheritance类覆盖,因为它不是inheritance的。 所以它不是虚拟的。

你所谓的“覆盖静态方法”实际上只是在另一个类上定义另一个静态方法。 它只会“隐藏”(这实际上是一个比那里真实的更强的词)另一个,而不是覆盖它。

Java中的抽象类只不过是与C ++等效的纯虚方法。

一个类不是一个方法。 抽象类不必具有“虚拟”或抽象方法,甚至任何方法。

C ++开发人员放弃了Javafunction,就像C ++重命名而不了解差异一样。 ;)

为什么我们说Java中的静态方法不是虚方法?

不确定是谁说的,但static方法不是多态的。

即使我们可以覆盖静态方法

我们不能,你只能隐藏或重载一个静态方法。

无论是使用类,子类还是实例来调用静态方法,都会忽略实际的类或实例。 你可以做到

 ((Thread) null).yield(); 

因为多态性适用于对象,而静态方法不涉及任何对象(但是与类相关)。

假设你有A级

 public class A { public static void doAStaticThing() { System.out.println("In class A"); } } 

和B.

 public class B extends A { public static void doAStaticThing() { System.out.println("In class B"); } } 

和另一个类中的方法如下:

 public void foo() { B aB = new B(); bar(B); } public void bar(A anA) { anA.doAStaticThing(); // gives a warning in Eclipse } 

您将在控制台上看到的消息是

 In class A 

编译器查看了方法栏中声明的anA类型,并静态绑定到类A的doAStaticThing() 。 该方法不是虚拟的。