Resumen Capitulo 11

Herencia sirve para definir una nueva clase a partir de otra clase existente, es una forma para reutilizar software, para hacer el programa más fácil de comprender, mantener y evitar redundancia.

11.2 Superclase y subclase

La herencia permite definir una clase general (es decir, una superclase) y luego extenderla a clases más especializadas (es decir, subclases).

Superclase es una clase existente y se conoce como parent class, base class, clase general.

Subclase es la nueva clase, y son clases más especificadas, se conocen como child class, extend class y derived class. En terminología de Java C1 (superclase) se extiende en otra clase C2(subclase) .

Puntos en consideración

1. Una subclase no es un subconjunto de su superclase, de hecho, una subclase generalmente contiene más información y métodos que su superclase.

2. Campos de datos privados en una superclase no son accesibles fuera de la clase. Por lo tanto, no se pueden usar directamente en una subclase. Sin embargo, se puede acceder por medio de get y set.

3. No todo tiene relación, por ejemplo, la altura y anchura de un cuadrado y rectángulo son diferentes.

4. Tener cuidado a la hora de realizar herencias ya que hay que pensar primero si tienen algo en común.

5. Java no permite herencia múltiple. Una clase sólo puede heredar directamente una sola superclase que se llama herencia única.

11.3 Usando la palabra clave super

La palabra clave super se refiere a la superclase y se puede utilizar para invocar los métodos y constructores de la superclase.

11.3.1 Llamando a constructores de superclase

Los constructores de una superclase no son heredados por una subclase. Solo se pueden invocar desde los constructores de las subclases utilizando la palabra clave super.

La sintaxis para llamar al constructor de una superclase es:

super(), or super(parameters);

La instrucción super () invoca al constructor sin argumentos de su superclase, y la instrucción super (argumentos) invoca al constructor de la superclase que coincide con los argumentos.

Debe usar la palabra clave super para llamar al constructor de la superclase, y la llamada debe ser la primera instrucción del constructor. Invocar el nombre de un constructor de superclase en una subclase provoca un error de sintaxis.

11.3.2 Encadenamiento de constructores

Un constructor puede invocar a un constructor sobrecargado o su constructor de superclase. Si ninguno se invoca explícitamente, el compilador automáticamente coloca super () como la primera instrucción en el constructor.

En cualquier caso, la construcción de una instancia de una clase invoca a los constructores de todas las superclases a lo largo de la cadena de herencia. Al construir un objeto de una subclase, el constructor de la subclase primero invoca a su constructor de superclase antes de realizar sus propias tareas. Si la superclase se deriva de otra clase, el constructor de la superclase invoca a su constructor de clase principal antes de realizar sus propias tareas. Este proceso continúa hasta que se llama al último constructor a lo largo de la jerarquía de herencia. Esto se llama encadenamiento de constructor.

11.3.3 Llamada a métodos de superclase: La palabra clave super también se puede utilizar para hacer referencia a un método que no sea el constructor en la superclase. La sintaxis es:

super.method (parámetros);

11.4 Métodos de anulación (Overriding)

Para anular un método, el método debe definirse en la subclase utilizando la misma firma y el mismo tipo de retorno que en su superclase.

Vale la pena señalar varios puntos:

■ Un método privado no puede ser anulado, porque no es accesible fuera de su propia clase. Si un método definido en una subclase es privado en su superclase, los dos métodos no tienen relación alguna.

■ Un método estático no se puede anular. Si un método estático definido en la superclase se redefine en una subclase, el método definido en la superclase se oculta. Los métodos estáticos ocultos se pueden invocar utilizando la sintaxis SuperClassName.staticMethodName.

11 .5 Anulación vs Sobrecarga ( Overriding vs Overloading)

Sobrecargar significa definir múltiples métodos con el mismo nombre, pero con asignaciones diferentes. Anulación significa proporcionar una nueva implementación para un método en la subclase.

A) OVERRRIDES B) OVERLOADS

Tenga en cuenta lo siguiente:

1- Overridden están en diferentes clases relacionadas por herencia, tienen la misma firma (signature) y tipo de retorno.

2- Overload puede estar en la misma clase o en diferentes clases relacionadas por herencia. Tienen el mismo nombre, pero una lista de parámetros diferentes.

Para evitar errores, puede usar una sintaxis especial de Java, denominada anulación de anulación (override annotation), para colocar @Override antes del método en la subclase.

11.6 La clase de objeto y su método toString ()

Todas las clases en Java descienden de la clase java.lang.Object.

Si no se especifica una herencia cuando se define una clase, la superclase de la clase es Object por defecto.

La asignatura del método toString () es:

public String toString ()

Invocar toString () en un objeto devuelve una cadena que describe el objeto. De forma predeterminada, devuelve una cadena que consta de un nombre de clase del cual el objeto es una instancia, un signo at (@) y la dirección de memoria del objeto en hexadecimal.

11.7 Polimorfismo

Polimorfismo significa que una variable de un supertipo puede referirse a un objeto de subtipo.

Los tres pilares de la programación orientada a objetos son la encapsulación, la herencia y el polimorfismo. Una clase define un tipo. Un tipo definido por una subclase se denomina subtipo, y un tipo definido por su superclase se denomina supertipo.

Un objeto de una subclase se puede usar donde sea que se use su objeto de superclase. Esto se conoce comúnmente como polimorfismo (de una palabra griega que significa «muchas formas»). En términos simples, el polimorfismo significa que una variable de un supertipo puede referirse a un objeto de subtipo.

Todo lo que está en la subclase debe estar en la superclase, pero no todo lo que está en la superclase debe estar en la subclase.

11.8 Enlace dinámico

Se puede implementar un método en varias clases a lo largo de la cadena de herencia. La JVM decide qué método se invoca en tiempo de ejecución.

Hay dos términos: tipo declarado (declared type) y tipo real (actual type). Una variable debe ser declarada un tipo.

El enlace dinámico funciona de la siguiente manera: supongamos que un objeto o es una instancia de las clases C1, C2,. . . , Cn-1 y Cn, donde C1 es una subclase de C2, C2 es una subclase de C3,. . . , y Cn-1 es una subclase de Cn, como se muestra en la Figura 11.2. Es decir, Cn es la clase más general y C1 es la clase más específica. En Java, Cn es la clase Object. Si o invoca un método p, la JVM busca la implementación del método p en C1, C2,. . . , Cn-1 y Cn, en este orden, hasta que se encuentre. Una vez que se encuentra una implementación, la búsqueda se detiene y se invoca la primera implementación encontrada.

11.9 Fundición de objetos y la instancia del operador (Casting Objects)

Una referencia de objeto se puede convertir en otra referencia de objeto. Esto se llama casting Objects .

En la sección anterior, la declaración

m (nuevo estudiante ());

asigna el objeto new Student () a un parámetro del tipo Object. Esta declaración es equivalente a

Objeto o = nuevo Estudiante (); // Casting implícito

m(0);

La declaración Object o = new Student (), conocida como conversión implícita, es legal porque una instancia de Student es una instancia de Object.

Estudiante b = (Estudiante) o; // Casting explícito

Siempre es posible convertir una instancia de una subclase en una variable de una superclase (conocida como upcasting), porque una instancia de una subclase siempre es una instancia de su superclase. Al lanzar una instancia de una superclase a una variable de su subclase (conocida como downcasting). Para que el lanzamiento sea exitoso, debe asegurarse de que el objeto a lanzar sea una instancia de la subclase.

Con instanceof sirve para saber que es una instancia.

Lanzar un valor de tipo primitivo es diferente de lanzar una referencia de objeto. Lanzar un valor de tipo primitivo devuelve un nuevo valor. Por ejemplo:

int edad = 45;

byte newAge = (byte) age; // Se asigna un nuevo valor a newAge

Sin embargo, emitir una referencia de objeto no crea un nuevo objeto. Por ejemplo:

Objeto o = nuevo círculo ();

Círculo c = (Círculo) o; // No se crea ningún objeto nuevo

11.10 El método igual al objeto

El método equals (Object) es otro método útil definido en la clase Object.

Otro método definido en la clase Object que se usa con frecuencia es el método igual. Su firma es:

público booleano igual (Objeto o)

Este método prueba si dos objetos son iguales. La sintaxis para invocarlo es:

object1.equals (object2);

La implementación predeterminada del método equals en la clase Object es:

public boolean equals (Object obj) {

return (esto == obj);

}

Esta implementación verifica si dos variables de referencia apuntan al mismo objeto usando el operador ==. Debe anular este método en su clase personalizada para probar si dos objetos distintos tienen el mismo contenido.

a) incorrecto b) correcto

11.11 La clase ArrayList

Un objeto ArrayList se puede usar para almacenar una lista de objetos.

Puede crear una matriz para almacenar objetos. Pero, una vez que se crea la matriz, su tamaño es fijo. Java proporciona la clase ArrayList, que se puede usar para almacenar un número ilimitado de objetos.

Crear una lista Array: ArrayList<String> cities = new ArrayList<String>();

ArrayList<java.util.Date> dates = new ArrayList<java.util.Date> ();

Usar la biblioteca

Import java.util.ArrayList;

Funciones que se pueden utilizar en arraylist:

Agregar elemento: add();

Tamaño de la lista size();

Si en la lista esta contenido el elemento indicado: contains();

Elemento indexado: indexof();

Si esta vacia isEmpty();

Remover un elemento remove();

Tenga en cuenta que puede ordenar una matriz utilizando el método java.util.Arrays.sort (array). Para ordenar una lista de arreglos, use el método java.util.Collections.sort (arraylist).

Forma incorrecta: ArrayList<int> list = new ArrayList<>();

Forma correcta: ArrayList<Integer> list = new ArrayList<>();

Es más sencillo implementar este programa usando una ArrayList por dos razones.

Primero, el tamaño de una ArrayList es flexible, por lo que no tiene que especificar su tamaño de antemano. Al crear una matriz, se debe especificar su tamaño.

Segundo, ArrayList contiene muchos métodos útiles. Por ejemplo, puede probar si un elemento está en la lista utilizando el método contains. Si usa una matriz, debe escribir código adicional para implementar este método.

11.12 Métodos útiles para listas

Java proporciona los métodos para crear una lista a partir de una matriz, para ordenar una lista y para encontrar el elemento máximo y mínimo en una lista, y para barajar una lista.

A menudo necesita crear una lista de matriz a partir de una matriz de objetos o viceversa. Puede escribir el código usando un bucle para lograr esto, pero una manera fácil es usar los métodos en la API de Java.

Aquí hay un ejemplo para crear una lista de matriz a partir de una matriz:

Array to array list

Sort a list

Métodos max y min

11.13 Estudio de caso: una clase de pila personalizada

De esta imagen se pueden destacar:

peek(): Retorna el primer elemento sin removerlo

pop(): Retorna y remueve el primer elemento

push(): Agrega un nuevo elemento al principio

11.14 The protected Data and Methods

A menudo es deseable permitir que las subclases accedan a los campos de datos o métodos definidos en la superclase, pero no permitir que las no subclases accedan a estos campos y métodos de datos. Para lograr esto, puede usar la palabra clave protegida. De esta manera, puede acceder a los campos o métodos de datos protegidos en una superclase desde sus subclases.

Los modificadores privados y protegidos solo se pueden usar para los miembros de la clase. El modificador público y el modificador predeterminado (es decir, sin modificador) se pueden usar en los miembros de la clase, así como en la clase. Una clase sin modificador (es decir, no una clase pública) no es accesible por clases desde otros paquetes.

11.15 Prevención de extensión y anulación

Es posible que ocasionalmente desee evitar que las clases se extiendan. En tales casos, use el modificador final para indicar que una clase es final y no puede ser una clase principal. sus subclases no pueden anular un método final.

Referencia:

Liang, Y. (2013). Introduction to Java programming (10th ed., pp. 410-442). Boston: Pearson.

Deja un comentario

Diseña un sitio como este con WordPress.com
Comenzar