Polimorfismo
En Java una variable o nombre usado para referirse a un objeto de una
clase X puede usarse para referirse a cualquier objeto de cualquier
subclase de la clase X.
Por ejemplo: Si tenemos Employee e;
e= new Employee(...); o
e= new Manager(...);
Esto también aplica a arreglos de Employee, cuyas entradas
podrían referirse a instancias de cualquier subclase de Employee.
El inverso no es válido. No se puede asignar una instancia de la
superclase a un nombre para la subclase.
Esta es una forma de polimorfismo por que e puede referirse a un
Employee o a un Manager.
Ligado Dinámico
Es importante entender qué método es
aplicado al invocar uno a un objeto que se puede referir a instancias
de distinta clase.
Al momento de la compilación el compilador intenta resolver el
método que corresponde según su nombre y
parámetro. Si la superclase y la clase base tiene definido
el mismo método ¿Cuál se llama?. Si el
método en la clase declarada para la variable no es privado,
static, o final, se invocará en forma dinámica. Esto es,
se invocará el método definido según el objeto
referenciado por el nombre y no según la
declaración del nombre. Por ello, si una clase derivada
redefine
el mismo método, éste será invocado.
Casting
Cómo podemos acceder a los métodos definido en una clase
derivada pero no en la base? Se debe hacer un cambio de tipo forzado.
Por ejemplo:
Employee e= new Manager(..);
Usando e no podemos acceder a los métodos sólo presentes
en Manager.
Si queremos hacerlo, usamos:
Manager m = (Manager) e;
Ahora sí podemos invocar todos los
métodos de Manager sobre m. ¿Cómo sabemos
que
e aloja una instancia de Manager? Lo podemos preguntar con el operador
instanceof.
if (e instance of Manager) {
m = (Manager) e;
.....
}
Clases Abstractas (abstract classes)
Llevando la idea de herencia a un extremo podemos
pensar en buenas clases para representar un grupo pero que no tienen
instancias propias. Por ejemplo Forma como clase base de Triangulo,
Circulo, Cuadrado. Forma puede indicar todo el comportamiento
válido para una forma pero no puede instanciarse por si mismo.
En
ente caso Forma debe declararse como clase
abstracta por tener al menos un
método declarado pero no implementado.
public abstract class Forma {
...
public abstract double area();
..
}
ver
PersonTest.java
Perros
y gatos
Superclase Object
Toda clase en Java hereda de la clase Object.
Ésta no requiere ser indicada en forma explícita. Esto
permite que podamos agrupar en forma genérica elementos de
cualquier clase. En esta clase hay métodos como equals() y
toString() que en la mayoría de loa casos conviene sobremontar.
ver
documentación de clase Object.
Ver (alumnos)
EqualsTest.java
Programación Genérica (Generic Programming)
Se le llama al hecho que podamos crear código
válido para cualquier tipo de dato específico. Por
ejemplo
en alguna clase podríamos incorporar:
static int
find (Object [ ] a , Object key)
{
int i;
for (i=0; i < a.length; i++)
if (a[i].equals(key) return i; // encontrado
return -1; // no exitoso
}