Java(POO)

Herencia
En orientación a objetos la herencia es el mecanismo fundamental para implementar la reutilización y extensibilidad del software. A través de ella los diseñadores pueden construir nuevas clases partiendo de una jerarquía de clases ya existente (comprobadas y verificadas) evitando con ello el rediseño, la remodificación y verificación de la parte ya implementada. La herencia facilita la creación de objetos a partir de otros ya existentes, obteniendo características (métodos y atributos) similares a los ya existentes.
La herencia es uno de los mecanismos de la programación orientada a objetos, por medio del cual una clase se deriva de otras, a la clase ya existente se le llama superclase, clase base o clase padre y a la nueva clase se le llama subclase, clase derivada o clase hija.

Jerarquía


Los descendientes de una clase heredan todas las variables y métodos que sus ascendientes hayan especificado como heredables, además de crear los suyos propios.
La característica de herencia, nos permite definir nuevas clases derivadas de otra ya existente, que la especializan de alguna manera. Así logramos definir una jerarquía de clases, que se puede mostrar mediante un árbol de herencia.
En todo lenguaje orientado a objetos existe una jerarquía, mediante la que las clases se relacionan en términos de herencia. En Java, el punto más alto de la jerarquía es la clase Object de la cual derivan todas las demás clases (paquete java.lang).

Tipos de herencia

En java existen dos tipos de herencia, herencia simple y herencia múltiple.

Herencia simple

Un objeto puede extender las características de otro objeto y de ningún otro, es decir, que solo puede heredar o tomar atributos de un solo padre o de una sola clase.





Herencia múltiple

Un objeto puede extender las características de uno o más objetos, es decir, puede tener varios padres.

Declaración

Para indicar que una clase deriva de otra, heredando sus propiedades (métodos y atributos), se usa el término extends, como en el siguiente ejemplo:

public class SubClase extends SuperClase
{
// Contenido de la clase
}

Por ejemplo, creamos una clase MiPunto3D, hija de la clase ya mostrada MiPunto:

class MiPunto3D extends MiPunto {
int z;
MiPunto3D( ) {
x = 0; // Heredado de MiPunto
y = 0; // Heredado de MiPunto
z = 0; // Nuevo atributo
}
}

La palabra clave extends se utiliza para decir que deseamos crear una subclase de la clase que es nombrada a continuación, en nuestro caso MiPunto3D es hija de MiPunto.

Limitaciones de la herencia

Todos los campos y métodos de una clase son siempre accesibles para el código de la misma clase.
Para controlar el acceso desde otras clases, y para controlar la herencia por las subclases, los miembros (atributos y métodos) de las clases tienen tres modificadores posibles de control de acceso:

  1. Public: Los miembros declarados public son accesibles en cualquier lugar en que sea accesible la clase, y son heredados por las subclases.

  2. Private: Los miembros declarados private son accesibles sólo en la propia clase.

  3. Protected: Los miembros declarados protected son accesibles sólo para sus subclases.










En este ejemplo, un objeto de la clase Hija, hereda los tres atributos (numeroFavorito, nacidoHace y dineroDisponible) y los tres métodos ( getApuesta(), getEdad() y getSaldo() ) de la clase Padre, y podrá invocarlos. Cuando se llame al método getEdad() de un objeto de la clase Hija, se devolverá el valor de la variable de instancia nacidoHace de ese objeto, y no de uno de la clase Padre.
Sin embargo, un objeto de la clase Hija, no podrá invocar al método getSaldo() de un objeto de la clase Padre, con lo que se evita que el Hijo conozca el estado de la cuenta corriente de un Padre.
La clase Visita, solo podrá acceder al método getApuesta(), para averiguar el número favorito de un Padre, pero de ninguna manera podrá conocer ni su saldo, ni su edad.


La clase object

La clase Object es la superclase de todas las clases da Java. Todas las clases derivan, directa o indirectamente de ella. Si al definir una nueva clase, no aparece la cláusula extends, Java considera que dicha clase desciende directamente de Object.

Los métodos públicos y protegidos de esta clase son:
  1. Public boolean equals(Object obj) compara si dos objetos son iguales, por defecto un objeto es igual solamente a si mismo.

  2. Public int hashCode() devuelve (con alta probabilidad) un valor distinto para cada objeto.

  3. Protected Object clone() throws CloneNotSuportedException devuelve una copia binaria del objeto (incluyendo sus referencias).

  4. Public final Class getClass() devuelve el objeto del tipo Class que representa dicha clase durante la ejecución.

  5. Protected void finalize() throws Throwable se usa para finalizar el objeto, es decir, se avisa al administrador de la memoria que ya no se usa dicho objeto, y se puede ejecutar código especial antes de que se libere la memoria.

  6. Public String toString() devuelvo una cadena describiendo el objeto.

El polimorfismo

El polimorfismo es un concepto de la programación orientada a objetos que nos permite programar en forma general, en lugar de hacerlo en forma específica. En general nos sirve para programar objetos con características comunes y que todos estos compartan la misma superclase en una jerarquía de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la programación.

Existen varias formas de polimorfismo:

  1. Cuando invocamos el mismo nombre de método sobre instancias de distinta clase.

  2. Cuando creamos múltiples constructores.

  3. Cuando vía subtipo asignamos una instancia de una subclase a una referencia a la clase base.
Para poner en práctica se hará un ejemplo bastante sencillo. Se hará una librería de clases que represente figuras tridimensionales y bidimensionales, y su respectiva jerarquía de clases. Las clases deben ser capaces de tener funcionamiento bastante básico, como obtener áreas, volúmenes y perímetros de la figura correspondiente.



La superclase de dicha jerarquía podría ser muy parecida a ésta:

public abstract class figura {
protected String nombre;
protected int color;
protected int grosorBorde;

public String getNombre(){
return this.nombre;
}
public void setNombre(String n){
this.nombre=n;
    }

public int getColor(){
return this.color;
}

public void setColor(int c){
this.color=c;
}

public int getGrosorBorde(){
return this.grosorBorde;
}

public void setGrosorBorde(int g){
this.grosorBorde=g;
}

public abstract void dibujar();
    }

//Las siguientes clases en el nivel de la jerarquía podrían quedar muy parecidas a éstas:

public abstract class figura2D extends figura {

public abstract int calcularArea();

public abstract int calcularPerimetro();
}

public abstract class figura3D extends figura {

public abstract int calcularVolumen();
}



Se le pide que forme las clases de la parte inferior de la jerarquía y que representarían los objetos a instanciarse.
Además, debe de realizar una implementación de esta librería, en donde el usuario pueda crear nuevas figuras y que éstas se almacenen en un arreglo de figuras.

Ligadura dinámica

La ligadura dinámica se encarga de ligar o relacionar la llamada a un método con el cuerpo del método que se ejecuta finalmente.

Existen dos tipos de ligadura: estática y dinámica.


Ligadura estática:

  1. Consiste en realizar el proceso de ligadura en tiempo de compilación según el tipo declarado del objeto al que se manda el mensaje.

  2. La utilizan (en Java) los métodos de clase y los métodos de instancia que son privados o final (ya que estos últimos no pueden ser sobrescritos).

Ligadura dinámica:

  1. Consiste en realizar el proceso de ligadura en tiempo de ejecución siendo la forma dinámica del objeto la que determina la versión del método a ejecutar.

  2. Se utiliza en todos los métodos de instancia de Java que no son privados ni final.

Funcionamiento de la ligadura dinámica

Resolución de conflictos entre Superclases y Subclases:
  1. Cuando existe un conflicto entre un método de una superclase y un método de la subclase, el comportamiento correcto es que el método de la subclase sobrescriba al de la superclase.

  2. Si estamos llamando a un método de la subclase desde una variable que ha sido declarada del tipo de la superclase. ¿Cómo se consigue que funcione correctamente?

  3. Ligadura Dinámica:
  4. Significa que la forma dinámica del objeto determina la versión de la operación que se aplicará.

  5. Esta capacidad de las operaciones para adaptarse automáticamente a los objetos a los cuales se aplican es una de las propiedades más importantes de la orientación a objetos.

Características de la Ligadura Dinámica

Puede variar de un lenguaje a otro, pero básicamente presentan unas características comunes. Los métodos que necesitan ligadura dinámica:
  1. Deben presentar ligadura dinámica solo aquellos que pueden ser redefinidos.

  2. Por ejemplo, en Java, los métodos de clase y los métodos de instancia privados y/o finales no presentan ligadura dinámica.

  3. En Java, si no se especifica nada se entenderá que el método puede ser redefinido y por tanto debe presentar ligadura dinámica.














1 comentario:

  1. Ojo, que la herencia múltiple no existe como tal en Java, pero por algo están las interfaces :D

    ResponderEliminar