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,OverridingPrivatethat extendsWithFinalsandOverridingPrivate2that extendsOverridingPrivate. - All three classes consist of a public
final f()method and a privateg()method. - We create a new instance of
OverridingPrivate2class. We call itsf()method and itsg()method. The methods invoked will be the ones in theOverridingPrivate2class. - We can upcast the
OverridingPrivate2object toOverridingPrivate, and we can also castOverridingPrivateobject 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.

