simple - super en java
Anulando las variables de instancia de una superclase (9)
¿Quiere decir con anular que quiere cambiar el tipo de datos, por ejemplo?
¿Qué haces con esta expresión?
public class A {
protected int mIndex;
public void counter(){
mIndex++;
}
}
public class B extends A {
protected String mIndex; // Or what you mean with overloading
}
¿Cómo desea cambiar la expresión de mIndex ++ sin sobrecarga del operador o algo como esto?
¿Por qué no podemos anular una variable de instancia de una superclase en una subclase?
No se accede a las variables polimórficamente. ¿Qué quieres hacer con esto que no puedes hacer con una variable protegida? (No es que yo recomiende el uso de variables mutables no privadas, personalmente).
Porque si cambió la implementación de un miembro de datos, posiblemente rompería la superclase (imagine cambiar el miembro de datos de una superclase de un flotante a un String).
Porque solo puedes anular el comportamiento y no la estructura. La estructura se graba en piedra una vez que se ha creado un objeto y se le ha asignado memoria. Por supuesto, esto suele ser cierto en los lenguajes estáticos.
Quizás quiso intentar anular el valor utilizado para inicializar la variable. Por ejemplo,
En lugar de esto (que es ilegal)
public abstract class A {
String help = "**no help defined -- somebody should change that***";
// ...
}
// ...
public class B extends A {
// ILLEGAL
@Override
String help = "some fancy help message for B";
// ...
}
Uno debería hacer
public abstract class A {
public String getHelp() {
return "**no help defined -- somebody should change that***";
}
// ...
}
// ...
public class B extends A {
@Override
public String getHelp() {
return "some fancy help message for B";
// ...
}
Si tiene la necesidad de anular una variable de instancia, es casi seguro que heredará de la clase worng.
En algunos idiomas, puede ocultar la variable de instancia suministrando una nueva:
class A has variable V1 of type X;
class B inherits from A, but reintroduces V1 of type Y.
Los métodos de clase A todavía pueden acceder al V1 original. Los métodos de la clase B pueden acceder al nuevo V1. Y si quieren acceder al original, pueden lanzarse a la clase A (Como ve, la programación sucia provoca más progrtamming sucio).
La mejor solución es encontrar otro nombre para la variable.
no podemos anular la estructura de las variables de instancia, pero superamos su comportamiento:
class A
{
int x = 5;
}
class B extends A
{
int x = 7:
}
class Main
{
public static void main(String dh[])
{
A obj = new B();
System.out.println(obj.x);
}
}
en este caso, la salida es 5.
puede anular un método, eso está bien, pero ¿qué quiere decir con anular una variable? si desea utilizar una variable en cualquier otro lugar en lugar de superclase puede usar super. como en super (nombres de variables); ¿Por qué quieres anular una variable? Quiero decir, ¿hay alguna necesidad?
class Dad{
public String name = "Dad";
}
class Son extends Dad{
public String name = "Son";
public String getName(){
return this.name;
}
}
Desde el método main () si llamas
new Son().getName();
devolverá "Son" Así es como puede anular la variable de superclase.