Me preguntaba si tiene sentido declarar un método privado como definitivo, y pensé que no tenía sentido. Pero imaginé que hay una situación exclusiva y escribí el código para resolverlo:¿Por qué la clase interna puede anular el método final privado?
public class Boom {
private void touchMe() {
System.out.println("super::I am not overridable!");
}
private class Inner extends Boom {
private void touchMe() {
super.touchMe();
System.out.println("sub::You suck! I overrided you!");
}
}
public static void main(String... args) {
Boom boom = new Boom();
Boom.Inner inner = boom.new Inner();
inner.touchMe();
}
}
Se compiló y funcionó. "Debería hacer TouchMe() final" pensé y lo hizo:
public class Boom {
private final void touchMe() {
System.out.println("super::I am not overridable!");
}
private class Inner extends Boom {
private void touchMe() {
super.touchMe();
System.out.println("sub::You suck! I overrided you!");
}
}
public static void main(String... args) {
Boom boom = new Boom();
Boom.Inner inner = boom.new Inner();
inner.touchMe();
}
}
y también funciona y me
[email protected]:~$ java Boom
super::I am not overridable!
sub::You suck! I overrided you!
qué dice?
Es "ocultar" o "shadowin" o algo así. De alguna manera muestra por qué extender la clase externa es un poco malvado (incluso en enumeraciones, realmente)./Pruebe 'Boom inner = boom.new Inner();' –
Buen ejemplo de por qué debería usar la anotación @Override. Asegúrese de que está anulando el método – Shawn
¿No debería escribir 'super ...' dos veces? * Actualización * No. Mea culpa. Ya veo. – DerMike