Contenido del artículo
Recuerdo de la herencia de Java
Considere la siguiente clase:
Clase CParentEsta clase tiene dos propiedades: A y B. En Java, las propiedades se llaman campos. Esta clase tiene un método que agrega dos números, que son los valores de campo. El nombre de la clase es CParent, con la C anterior, para la calculadora. El siguiente segmento de código en el método main (), salidas 5:
CPARENT PROPED = new CParent ();Considere la siguiente clase, que es la subclase de la clase anterior (CParent):
clase Cchild extiende CParentNota El uso de la palabra clave se extiende. Esta clase tiene el campo, c, y el método, multiplicar (). La clase hereda los campos, 'A' y B, y el método, add (). Sin embargo, si el valor de campo para 'a' o b se debe usar para este objeto instanciado actual (objeto infantil), aún debe reasignarse como un valor. Para esta clase, el valor de 'a' heredado se multiplica por el valor de campo de la clase de C. El nombre de esta clase es Cchild, con la C anterior, para la calculadora. El siguiente segmento de código en el método Main () se adapta a esta clase:
Cchild Child = new Cchild ();La salida es 8. Tenga en cuenta que, aunque el campo 'A' fue heredado, todavía tenía que ser reasignado un valor; En este caso, el mismo valor.
Considere la siguiente clase, que es la subclase de la clase anterior, Cchild:
Clase Cgrandchild extiende CchildNota El uso de la palabra clave se extiende. Esta clase tiene el campo, d, y el método, divide (). La clase hereda a los miembros, 'a', b, y add () de la clase Cchild, que los heredó de la clase CParent. También hereda los miembros, c, y multiplica () de la clase Cchild. Sin embargo, si el valor de campo para 'a' o b o c, de las clases matriz o abuelos, se debe utilizar para este objeto instanciado actual (objeto de nieto), aún debe reasignarse como un valor. Para esta clase, el valor de 'a' heredado se divide por el valor de campo de la clase de D. El nombre de esta clase es Cgrandchild, con la C anterior, para la calculadora. El siguiente segmento de código en el método Main () se adapta a esta clase:
CGrandChild gchild = new CGrandChild ();La salida es 1. Tenga en cuenta que, aunque el campo 'A' fue heredado, todavía tenía que ser reasignado un valor; En este caso, el mismo valor, 2.
Uso de la palabra clave súper
Campo y super
En el programa anterior, el valor para el campo, 'a' se estableció tres veces, una vez para el objeto principal, una vez para el objeto infantil, y una vez para el objeto de nieto. Para evitar este restablecimiento cada vez, el valor de 2 se puede asignar una vez, en la implementación de la clase principal (definición) de la siguiente manera:
Esto resuelve el problema de restablecer para cada objeto descendiente. En las clases descendientes, el campo, 'A' simplemente se hace referencia (normalmente).
Para acceder al valor de un campo heredado, la palabra clave súper debe usarse en la implementación de la clase descendiente de interés, de la siguiente manera:
súper.nombre del campoEl siguiente segmento de código muestra cómo se ha accedido al nombre 'A', en una nueva implementación de CCHILD:
clase Cchild extiende CParentLa clase, Cchild, ahora tiene su propio nombre, P en lugar de 'a'. Y así la declaración en el método add (),
devolver a * c;es ahora,
regresar p * c;De manera similar, la implementación de la clase, CgrandChild puede haber 'a' reemplazado por Q, como sigue:
Clase Cgrandchild extiende CchildNota: La herencia tiene lugar en todas las clases descendientes. El campo 'A' y el método add () se heredan en la clase CCHILD y en la clase CgrandChild.
Método y super
Del mismo modo, se puede acceder a un campo heredado en la implementación de una clase descendiente; También se puede acceder a un método heredado en una clase descendiente, utilizando la palabra clave súper. La sintaxis es:
La implementación de la clase CCHILD original se puede modificar de la siguiente manera:
clase Cchild extiende CParentTenga en cuenta que el uso de super. El método Add () heredado ahora se considera una "suma" en la implementación de CCHILD. El campo C, y el método, multiplicar (), todavía están allí. Un segmento de código para la adición en el método main () que se adapta a esta clase CCHILD modificada es:
Cchild Child = new Cchild ();La salida es 5, suponiendo que la clase principal se modificó con:
int a = 2;Constructor y super
El constructor predeterminado, que no se implementa, se hereda en cada clase descendiente y no tiene que contabilizarse en la implementación de los descendientes y en el método principal (). Sin embargo, una vez que una clase principal tiene un constructor personalizado, el resto de sus descendientes deben tener un constructor similar. Considere la clase principal, con un constructor personalizado, como sigue:
Los campos de 'a' y b se declaran sin asignación. El constructor hace la tarea. La clase infantil debe tener lo mismo o un constructor similar. La clase infantil correspondiente para la jerarquía de la calculadora original puede ser:
clase Cchild extiende CParentEl constructor aquí es el mismo que el de los padres. El cuerpo del constructor aquí solo tiene:
super (x, y);que solo llama al constructor del padre, con los argumentos recibidos. "Super" aquí representa el constructor de la clase principal. Este es otro uso de Super. No hay modificación en este constructor infantil. La clase de nieto correspondiente para la jerarquía de calculadora original puede ser:
Clase Cgrandchild extiende CchildEl constructor aquí se modifica. Tiene los mismos parámetros x e y y un parámetro adicional, z. z es asignar el valor para d, el divisor. El cuerpo para el constructor comienza llamando al constructor de la clase principal. Entonces se asigna el campo para el divisor. El siguiente segmento de código en el método Main () se adapta a esta clase:
CgrandChild GCHILD = New CgrandChild (2, 3, 2);La salida para esto es 1.
Conclusión
Super buscará algo en la clase matriz inmediata. Si no lo ve allí, lo buscará en la clase de abuelos. Si no lo ve allí, lo buscará en la clase de bisabuelo; y así sucesivamente, hasta que lo vea o no lo ve. "Super" generalmente se usa dentro de la implementación de una subclase. Se utiliza para campo, método y constructor. La superclase directa es la clase principal. La clase de abuelos es una superclase, pero no la superclase directa. A continuación, el lector debe comprender el uso de "super" con clases anidadas; ver más tarde.