There something ambiguous about this idea and I need some clarifications.
My problem is when using this code:
public class B {
private void don() {
System.out.println("hoho private");
}
public static void main(String[] args) {
B t = new A();
t.don();
}
}
class A extends B {
public void don() {
System.out.println("hoho public");
}
}
The output is hoho private
.
Is this because the main function is in the same class as the method don
, or because of overriding?
I have read this idea in a book, and when I put the main
function in another class I get a compiler error.
You cannot override a private
method. It isn't visible if you cast A
to B
. You can override a protected
method, but that isn't what you're doing here (and yes, here if you move your main
to A
then you would get the other method. I would recommend the @Override
annotation when you intend to override,
class A extends B {
@Override
public void don() { // <-- will not compile if don is private in B.
System.out.println("hoho public");
}
}
In this case why didn't compiler provide an error for using
t.don()
which isprivate
?
The Java Tutorials: Predefined Annotation Types says (in part)
While it is not required to use this annotation when overriding a method, it helps to prevent errors. If a method marked with
@Override
fails to correctly override a method in one of its superclasses, the compiler generates an error.