herencia - Java: ¿son this.foo() y super.foo() iguales cuando foo() está en la súper clase?
super(); (2)
Sí, this.foo()
llama al mismo método que super.foo()
.
Tenga en cuenta que habrá una diferencia si se foo()
en la clase secundaria. Pero en este caso, ejecuta el mismo método de implementación.
Usamos super.foo()
cuando necesitamos solicitar específicamente que se ejecute la implementación del método de la superclase, cuando hay uno disponible en la clase actual.
Usar super tiene sentido porque method () es parte de la super clase
Sí, pero recuerde que la clase secundaria puede cambiar en algún momento y obtener un foo()
anulado, en cuyo caso, super.foo()
puede comenzar a llamar a la implementación no deseada.
Esto es algo a tener en cuenta. Por este motivo, se puede justificar llamar a this.foo()
, o foo()
no calificado.
Digamos que tengo las siguientes clases:
class Foo {
protected void method() {}
}
class Bar extends Foo {
}
En este punto, desde la barra de la clase, tengo acceso al method()
de dos maneras:
-
super.method();
-
this.method();
Por lo que veo, parecen realizar la misma acción. ¿Hay alguna diferencia entre estos dos en este contexto? ¿Hay una versión preferida para usar si es así?
Usar super
tiene sentido porque method()
es parte de la super clase. Supongo que usar this
tiene sentido, ya que Bar heredará las propiedades de la clase Foo y, por lo tanto, también el method()
, ¿no?
Solo ten en cuenta que el niño puede ser anulado una vez más:
public class Main {
static class Foo {
protected void method() {
System.out.println("Bye");
}
}
static class Bar extends Foo {
{
this.method();
super.method();
}
}
static class Baz extends Bar {
protected void method() {
System.out.println("Hi");
}
}
public static void main(String[] args) {
new Baz();
}
}
Produce:
Hi
Bye
Entonces, aunque this.method()
y super.method()
pueden comportarse de la misma manera en algunos casos, no producen el mismo código de bytes.