Saturday, 18 November 2017

java - Why doesn't the compiler complain when I try to override a static method?

itemprop="text">

I know that we cannot override static
methods in Java, but can someone explain the following
code?



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


class B extends A {
public static void a() {

System.out.println("B.a()");

}
}


How was
I able to override method a() in class
B?


itemprop="text">
class="normal">Answer



You didn't
override anything here. To see for yourself, Try putting
@Override annotation before public static void
a()
in class B and Java will throw an
error.



You just defined a function in class
B called a(), which is distinct (no
relation whatsoever) from the function a() in class
A.



But Because
B.a() has the same name as a function in the parent class, it
hides A.a() [As pointed by Eng.
Fouad]. At runtime, the compiler uses the actual class of the declared reference to
determine which method to run. For
example,



B b = new
B();
b.a() //prints B.a()

A a = (A)b;
a.a()
//print A.a(). Uses the declared reference's class to find the
method.


You cannot
override static methods in Java. Remember static methods and
fields are associated with the class, not with the objects. (Although, in some languages
like Smalltalk, this is possible).



I found some
good answers here: href="https://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods">Why
doesn't Java allow overriding of static methods?



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print ...