class
You cannot override a private or a private final method
This is an example explaining why you cannot override a private or a private final method. The example is described in short:
- We have created three classes,
WithFinals
,OverridingPrivate
that extendsWithFinals
andOverridingPrivate2
that extendsOverridingPrivate
. - All three classes consist of a public
final f()
method and a privateg()
method. - We create a new instance of
OverridingPrivate2
class. We call itsf()
method and itsg()
method. The methods invoked will be the ones in theOverridingPrivate2
class. - We can upcast the
OverridingPrivate2
object toOverridingPrivate
, and we can also castOverridingPrivate
object to WithFinals, but we cannot call their methods because they are not visible.
Let’s take a look at the code snippet that follows:
package com.javacodegeeks.snippets.core; class WithFinals { // Identical to "private" alone: private final void f() { System.out.println("WithFinals.f()"); } // Also automatically "final": private void g() { System.out.println("WithFinals.g()"); } } class OverridingPrivate extends WithFinals { private final void f() { System.out.println("OverridingPrivate.f()"); } private void g() { System.out.println("OverridingPrivate.g()"); } } class OverridingPrivate2 extends OverridingPrivate { public final void f() { System.out.println("OverridingPrivate2.f()"); } public void g() { System.out.println("OverridingPrivate2.g()"); } } public class FinalOverridingIllusion { public static void main(String[] args) { OverridingPrivate2 op2 = new OverridingPrivate2(); op2.f(); op2.g(); // You can upcast: OverridingPrivate op = op2; // But you can't call the methods: //! op.f(); //! op.g(); // Same here: WithFinals wf = op2; //! wf.f(); //! wf.g(); } }
Output:
OverridingPrivate2.f()
OverridingPrivate2.g()
This was an example explaining why you cannot override a private or a private final method in Java.