java - how - ¿Qué método está anulado?
java override method (7)
Esta pregunta ya tiene una respuesta aquí:
Class A
tiene el método run()
y la interfaz B también tiene el método run()
. La pregunta es simple, ¿qué método run()
está anulado en Main
clase Main
y cómo lo probaremos? ¿Por qué no hay conflicto (error de tiempo de compilación) en este código?
class A{
void run(){System.out.println("A class");}
}
interface B{
void run();
}
class Main extends A implements B{
public static void main(String args[]){
Main m = new Main();
m.run();
}
// Overridding method
public void run(){
System.out.println("run method");
}
}
run()
métodorun()
de la interfaz B se implementará en la clase Main mediante el método reemplazado de la clase A.
Agregar un punto extra,
No escribirás el método run()
en la clase secundaria Main
, no obtendrás el conocido error "Unimplemented methods". Esto es cierto para public
métodos public
de clase A para métodos no públicos. Obtendrá error de compilación: el método heredado no puede ocultar el método abstracto público.
Esto se debe a que los métodos de interfaz son públicos por defecto y no se puede ocultar con el modificador de acceso default (package private)
.
Muestra:
class A{
public void run() {
System.out.println("This method will be inherited.");
}
}
interface B{
void run();
}
class Main extends A implements B{
public static void main(String args[]){
Main m = new Main();
m.run();
}
}
OUTPUT : This method will be inherited.
En la instancia de código anterior, el método run()
se hereda de la clase A que implementará el método run()
de la interfaz B.
El método de la superclase siempre se denomina método overridden
, mientras que el método de la subclase se llama método de overriding
.
El método final cannot be
anulado . [si el método de la superclase es final]
Los métodos finales can
anular . [Léelo como una forma gramatical. Este método está en la subclase y es final, pero el método de la superclase no es final]
La interfaz B
dice que cualquier clase que lo implemente debe tener un método de ejecución. Main extiende A y hereda el método run()
A
Principal cumple con el requisito de la interfaz B
para tener un método de ejecución. El método de ejecución en Main reemplaza el método run()
que obtuvo de la clase A
// This is a class with a run method.
class A{
void run(){System.out.println("A class");}
}
// Anything implementing this interface must have a run method.
interface B{
void run();
}
// This class is an extension of A (and therefore has A''s run() method)
// This class implements B and must have a run method, which it does, because it has A''s
class Main extends A implements B{
public static void main(String args[]){
Main m = new Main();
m.run();
}
// This method then overrides the run Method it inherited from A
// And this method meets the requirement set by implementing B.
public void run(){
System.out.println("run method");
}
}
Lo que se llamará es
public void run(){
System.out.println("run method");
}
¿Por qué?
Está implementando la run
de la interface B
y también está anulando la implementación A
de la misma.
Si elimina la última implementación de run()
y elimina los implements B
, se run()
de A
Mira este enlace ...
Llegarás a saber más de lo que contamos ...
http://docs.oracle.com/javase/tutorial/java/IandI/override.html
No hay conflicto porque ambos métodos tienen la misma firma. Las declaraciones de métodos en las interfaces no se anulan porque no implementan nada. Entonces, en este caso, el método run en la clase A se reemplaza.
Por otro lado, cuando se anulan los métodos, se recomienda utilizar la anotación @Override
, por ejemplo
@Override
public void run() {
....
}
se anula la run
de B
se implementa la run
de B
Como B
es una interfaz, solo establece cómo se comportan sus objetos ante los demás y no aplica ningún comportamiento en sí mismo.