Estaba leyendo la Guía del programador para la certificación SCJP Java ™ de Khalid Mughal.
En el capítulo Herencia, explica que
La herencia de los miembros está estrechamente vinculada a su accesibilidad declarada. Si un miembro de la superclase es accesible por su nombre simple en la subclase (sin el uso de ninguna sintaxis adicional como super), ese miembro se considera heredado
También menciona que los métodos estáticos no se heredan. Pero el siguiente código está perfectamente bien:
class A
{
public static void display()
{
System.out.println("Inside static method of superclass");
}
}
class B extends A
{
public void show()
{
// This works - accessing display() by its simple name -
// meaning it is inherited according to the book.
display();
}
}
¿Cómo puedo usar directamente display()
en clase B
? Aún más, B.display()
también funciona.
¿La explicación del libro solo se aplica a los métodos de instancia?
java
inheritance
static
Algoritmo
fuente
fuente
Respuestas:
Todos los métodos accesibles son heredados por subclases.
De los tutoriales de Sun Java :
La única diferencia con los métodos estáticos heredados (clase) y los métodos heredados no estáticos (instancia) es que cuando escribe un nuevo método estático con la misma firma, el método estático antiguo simplemente se oculta, no se anula.
De la página en la diferencia entre anular y ocultar.
fuente
Si eso es lo que realmente dice el libro, está mal. [1]
La especificación del lenguaje Java # 8.4.8 establece:
[1] No dice eso en mi copia, primera edición, 2000.
fuente
Puede experimentar la diferencia en el siguiente código, que es una ligera modificación sobre su código.
Esto se debe a que los métodos estáticos son métodos de clase.
A.display () y B.display () llamarán al método de sus respectivas clases.
fuente
B.display () funciona porque la declaración estática hace que el método / miembro pertenezca a la clase, y no a ninguna instancia de clase en particular (también conocida como Object). Puedes leer más sobre esto aquí .
Otra cosa a tener en cuenta es que no puede anular un método estático, puede hacer que su subclase declare un método estático con la misma firma, pero su comportamiento puede ser diferente de lo que esperaría. Esta es probablemente la razón por la que no se considera heredada. Puede consultar el escenario problemático y la explicación aquí .
fuente
Los métodos estáticos en Java se heredan, pero no se pueden anular. Si declara el mismo método en una subclase, oculta el método de la superclase en lugar de anularlo. Los métodos estáticos no son polimórficos. En el momento de la compilación, el método estático estará vinculado estáticamente.
Ejemplo:
Obtendrás lo siguiente:
fuente
Los métodos estáticos se heredan en Java pero no participan en el polimorfismo. Si intentamos anular los métodos estáticos, simplemente ocultarán los métodos estáticos de la superclase en lugar de anularlos.
fuente
Este concepto no es tan fácil como parece. Podemos acceder a miembros estáticos sin herencia, que es la relación HasA. Podemos acceder a miembros estáticos extendiendo también la clase padre. Eso no implica que sea una relación ISA (Herencia). En realidad, los miembros estáticos pertenecen a la clase, y static no es un modificador de acceso. Mientras los modificadores de acceso permitan acceder a los miembros estáticos, podemos usarlos en otras clases. Al igual que si es público, será accesible dentro del mismo paquete y también fuera del paquete. Para privado no podemos usarlo en ningún lado. Por defecto, podemos usarlo solo dentro del paquete. Pero para protegidos tenemos que extender la superclase. Por lo tanto, llevar el método estático a otra clase no depende de ser estático. Depende de los modificadores de acceso. Entonces, en mi opinión, Los miembros estáticos pueden acceder si los modificadores de acceso lo permiten. De lo contrario, podemos usarlos como usamos por relación Hasa. Y tiene una relación que no es herencia. Nuevamente, no podemos anular el método estático. Si podemos usar otro método pero no podemos anularlo, entonces es la relación HasA. Si no podemos anularlos, no será herencia, por lo que el escritor estaba 100% correcto.
fuente
El método estático se hereda en la subclase, pero no es polimorfismo. Cuando escribe la implementación del método estático, el método de clase del padre se sobre oculta, no se anula. Piense, si no se hereda, ¿cómo puede acceder sin él
classname.staticMethodname();
?fuente
Todos los miembros públicos y protegidos se pueden heredar de cualquier clase, mientras que los miembros predeterminados o del paquete también se pueden heredar de la clase dentro del mismo paquete que el de la superclase. No depende de si es miembro estático o no estático.
Pero también es cierto que la función miembro estática no participa en el enlace dinámico. Si la firma de ese método estático es la misma tanto en la clase principal como en la secundaria, se aplica el concepto de Sombreado, no el polimorfismo.
fuente
Puede anular los métodos estáticos, pero si intenta usar el polimorfismo, entonces funcionan de acuerdo con el alcance de la clase (Contrariamente a lo que normalmente esperamos).
En el primer caso, o / p es el "en el método estático de B" # anulación exitosa
fuente
Podemos declarar métodos estáticos con la misma firma en la subclase, pero no se considera una anulación, ya que no habrá ningún polimorfismo en tiempo de ejecución. Debido a que todos los miembros estáticos de una clase se cargan en el momento de la carga de la clase, por lo que decide compilar tiempo (anulación en tiempo de ejecución) Por lo tanto, la respuesta es 'No'.
fuente
Muchos han expresado su respuesta en palabras. Esta es una explicación extendida en los códigos:
Resultados:
Por lo tanto, esta es la conclusión:
null
instancia. Mi conjetura es que el compilador usará el tipo de variable para encontrar la clase durante la compilación y traducir eso a la llamada al método estático apropiado.fuente
Los miembros estáticos son miembros universales. Se puede acceder desde cualquier lugar.
fuente
Los miembros estáticos no se heredarán a la subclase porque la herencia es solo para miembros no estáticos. Y los cargadores de clases cargarán los miembros estáticos dentro del grupo estático. La herencia es solo para aquellos miembros que están cargados dentro del objeto
fuente