java

Override "private" method in java


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.


Solution

  • 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 is private?

    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.