In object-oriented paradigm, a virtual function or virtual method is a function or method whose behavior can be overridden within an inheriting class by a f
It's simple, a static method cannot be overridden by an inheriting class, since it's not inherited. So it's not virtual.
What you call "overriding a static method" is actually only defining another static method on another class. It'll only "hide" (and that's actually a much stronger word than what'd be actually true there) the other one, not override it.
An abstract class in Java is nothing but the pure virtual method equivalent to C++.
A class is not a method. An abstract class doesn't have to have "virtual" or abstract methods, or even any methods.
Something C++ developers put down Java features as just like C++ renamed without understanding the differences. ;)
Why do we say that a static method in Java is not a virtual method?
Not sure who says this, but static
methods are not polymorphic.
Even if we can override the static method
We can't, you can only hide or overload a static method.
Whether you use the class or sub-class or instance to invoke a static method the actual class or instance is ignored. e.g. you can do
((Thread) null).yield();
Suppose you have class A
public class A
{
public static void doAStaticThing()
{
System.out.println("In class A");
}
}
And B
public class B extends A
{
public static void doAStaticThing()
{
System.out.println("In class B");
}
}
And a method in another class like this:
public void foo()
{
B aB = new B();
bar(B);
}
public void bar(A anA)
{
anA.doAStaticThing(); // gives a warning in Eclipse
}
The message you will see on the console is
In class A
The compiler has looked at the declared type of anA
in method bar and statically bound to class A's implementation of doAStaticThing()
. The method is not virtual.
Because polymorphism applies to objects, while a static method doesn't relate to any object (but to a class).
You can't override static methods. They are bound at compile-time. They are not polymorphic. Even if you try to invoke it as if it were an instance method (which IMO you shouldn't do) it's bound to the compile-time type of that expression, and the execution-time value is completely ignored (even if it's null):
Thread otherThread = null;
otherThread.sleep(1000); // No errors, equivalent to Thread.sleep(1000);
This behaviour can be very confusing for a reader, which is why at least some IDEs allow you to generate warnings or errors for accessing static members "through" a reference. It was a flaw in Java's design, pure and simple - but it doesn't make static methods virtual at all.