Publicado el 31 de Mayo del 2018
1.210 visualizaciones desde el 31 de Mayo del 2018
341,6 KB
19 paginas
Creado hace 18a (23/10/2006)
Herencia. Clases abstractas. Genericidad
• Clase Object
• Polimorfismo y ligadura dinámica
• super
• Herencia y creación
• Clases abstractas
• Genericidad
1
Herencia en Java
• Herencia simple
• Object es la clase raíz (paquete java.lang)
• Object describe las propiedades comunes a todos los objetos
Object
A
B
C
D
Terminología:
- C y D son subclases de B
- B es la superclase de C y D
El lenguaje de programación Java
2
1
Herencia en Java
• Una subclase hereda de su superclase métodos y variables tanto
de clase como de instancia.
• Una subclase puede añadir nuevos métodos y variables.
• Una subclase puede redefinir métodos heredados.
• Sintaxis:class nombreHija extends nombrePadre {…}
• Por defecto toda clase extiende la clase Object
class Contador {…} ⇔class Contador extends Object {…}
El lenguaje de programación Java
3
Ejemplo
public class ContadorColoreado extends Contador {
//nueva variable de instancia
private String color ;
public ContadorColoreado(){
super();
setColor(“transparente”);
Llamada al
constructor del
padre
}
public ContadorColoreado(int v, int s, String c) {
super(v,s);
setColor(c);
Object
Contador
}
...
}
ContadorColoreado
El lenguaje de programación Java
4
2
Acceso protegido
• Una subclase no puede acceder a los campos privados de
la superclase
• Para permitir que un método de la subclase pueda acceder
a un campo de la superclase, éste tiene que declararse
como protected
• Protected: miembros visibles a las subclases y al resto
de clases del paquete
• Resumen de modificadores de acceso:
– private
– public
– protected
– Sin modificador –visible en el paquete
–visible sólo en la clase
–visible a todas las clases
–visible en el paquete y las subclases
El lenguaje de programación Java
5
Conversión de tipos
• Java es un lenguaje fuertemente tipado, es decir, en tiempo
de compilación se comprueba la compatibilidad de tipos
• Conversión implícita: (automática)
– tipos primitivos a uno que soporte un rango mayor de valores
float saldo = 300; //podemos asignarle un entero
int codigo = 3.7; //ERROR
– conversión de referencias: todo objeto es compatible con sus
superclases
• cast-up
• siempre válido
Rectangulo r;
Cuadrado c = new Cuadrado();
r = c;
Rectangulo
Cuadrado
6
3
Conversión de tipos
• Conversión explícita:
– tipos primitivos perdiendo información
long l = 200;
int i = (int)l;
– conversión de referencias asignar a un objeto de una subclase
uno de la superclase
• cast-down o narrowing
• No siempre válido
• El error se puede producir:
– en tiempo de ejecución (ClassCastException)
– en tiempo de compilación si no es ni siquiera una subclase.
7
Conversión explícita de referencias
• Puede dar un error en ejecución:
Figura [] figuras = new Figura [30];
…
Rectangulo r = (Rectangulo)figuras[i];
• Comprobar el tipo antes de la conversión:
if (figuras[i] instanceof Rectangulo)
r = (Rectangulo)figuras[i]
• Daría error en compilación:
Cuenta c = (Cuenta)figuras[i];
El lenguaje de programación Java
8
4
instanceof
• Ejemplo: asignar una comisión a todos los jefes de la
empresa. La variable plantilla hace referencia a una
colección de empleados.
public void aplicarComision(double comision){
for (Empleado e : plantilla){
if (e instanceof Jefe)
(Jefe)e.setComision(comision);
}
El lenguaje de programación Java
9
Redefinición
• Un método de la subclase con la misma signatura y valor
de retorno que un método de la superclase lo está
REDEFINIENDO.
• Para evitar la redefinición de un método se utiliza el
modificador final.
• Puede cambiar el valor de acceso siempre que lo relaje,
es decir, puede pasar de protected a public pero no a
private.
• Los atributos no se pueden redefinir, sólo se OCULTAN (el
campo de la superclase todavía existe pero no se puede
acceder)
El lenguaje de programación Java
10
5
public class Poligono{
private Punto [] vertices;
Ejemplo redefinición
private int numVertices;
…
public float perimetro(){ //{α}
double peri=0;
Punto anterior=vertices[0];
Punto actual;
int ultimo=numVertices-1;
for (int i=1; i<=ultimo; i++){
actual=vertices[i];
peri+=anterior.distancia(actual);
anterior=actual;
}
//distancia del ultimo con el primero
return peri+=vertices[ultimo].distancia(vertices[0]);
}
}
}
public class Rectangulo{ //{β}
private double lado1;
privare double lado2;
…
public float perimetro(){
return 2*lado1+2*lado2;
}
Añade atributos
Redefine métodos
El lenguaje de programación Java
11
Polimorfismo y ligadura dinámica
• Polimorfismo: una entidad puede hacer referencia a objetos
de diferentes tipos en tiempo de ejecución.
• Ligadura dinámica: en tiempo de ejecución se elegirá la
versión mas adecuada según el tipo del objeto receptor.
• Sea la jerarquía:
Object
Poligono
perimetro+ {α}
Rectangulo
perimetro++ {β}
Poligono p;
/*
Puede referenciar a un objeto
Poligono o Rectangulo
*/
Rectangulo r = new Rectangulo();
p=r;
float peri = p.perimetro();
{β}
El lenguaje de programación Java
12
6
super
• Palabra clave disponible en todos los métodos no-static
• Se invoca a la versión del método de la primera superclase
que lo contenga
• Ejemplo:
public class Punto{
… //(x,y)
public void borrar(){}
}
public class Pixel extends Punto{
…
public void borrar(){
}
}
super.borrar(); //borra el Punto
color = null;
El lenguaje de programación Java
13
Ejemplo super
class Uno {
public int test(){return 1;}
public int result1(){return this.test();}
}
class Dos extends Uno{
}
class Tres extends Dos{
public int test(){return 2;}
}
class Cuatro extends Tres{
}
public int test(){return 4;}
public int result2(){return this.result1();}
public int result3(){return super.test();}
Uno
Dos
Tres
Cuatro
El lenguaje de programación Java
14
7
Herencia. ‘super’
public class PruebaSuperThis{
public static void main (String args[]){
Uno ob1 = new Uno();
Dos ob2 = new Dos();
Tres ob3 = new Tres();
Cuatro ob4 = new Cuatro();
System.out.println("ob1.test = "+ ob1.test());
System.out.println("ob1.result1 = " + ob1.result1());
System.out.println("ob2.test = " + ob2.test());
System.out.println("ob2.result1 = " + ob2.result1());
System.out.println("ob3.test = " + ob3.test());
System.out.println("ob4.result1 = " + ob4.result1());
System.out.println("ob3.result2 = " + ob3.result2());
System.out.println("ob4.result2 = " + ob4.result2());
System.out.println("ob3.result3 = " + ob3.result3());
System.out.println("ob4.result3 = " + ob4.result3());
El lenguaje de programación Java
}
}
1
1
2
2
2
4
2
4
2
2
15
Clases abstractas
• Se fija un conjunto de métodos y atributos que permitan
modelar un cierto concepto, que será refinado mediante la
herencia.
• Métodos abstractos:
– sólo cuentan con la declaración y no poseen cuerpo de definición
– la implementación es específica de cada subclase
• Toda clase que contenga algún método abstracto (heredado
o no) es abstracta. Puede tener también métodos efectivos.
• Tiene que derivarse obligatoriamente
• NO se puede hacer un new de una clase abstracta. SI
deben definir los constructores.
El lenguaje de programación Java
16
8
Ejemplos
• public abstract class Figura {
public abstract void dibujar();
public abstract void rotar();
...
}
public class Rectangulo extends Figura {
public void dibujar(){
//código especifico para dibujar rectángulos
...
}
...
}
• Clases abstractas en Java: Number y Dictionary
17
Herencia. Clase Object
• Todas las clases heredan directa o indirectamente de la clase Object,
raíz de la jerarquía.
• Toda clase tiene disponibles sus métodos:
– public final Class getClass() clase que representa el tipo del objeto
– public boolean equals(Object obj) igualdad de valores
– public String toString() Devuelve la representación del obj en un
String
– protected Object clone() devuelve una copia del objeto
– public int hashCode() devuelve un código que identifica de manera
- protected void finalize() relacionado con liberar memoria
• Hay que redefinir equals, toString, hashCode y clone para
única al objeto
adaptarlos.
El lenguaje de programación Java
18
9
Método getClass. Clase Class
• Sirve para identificar el tipo de los objetos en tiempo de
ejecución
• Describe las propiedades de la clase de un objeto
• String getName(): devuelve el nombre de la clase
• Ejemplo:
Empleado e; …
System.out.println(e.getClass().getName()
SALIDA: Empleado Pedro Martínez
+ e.getNombre());
El lenguaje de programación Java
19
getClass vs instanceof
• instanceof
“¿Eres de esta clase o de una clase derivada de ésta?”
• comparando los objetos Class
“¿Eres exactamente de esta clase?”
• Ejemplo: Sea Rectangulo una subclase de la clase
Figura
Rectangulo r = new Rectangulo();
(r instanceof Figura)
true
(r.getClass().equals(Figura.class)) false
El lenguaje de programación Java
20
10
Igualdad en Java
•
Igualdad de referencias (identidad):
objPila1 == objPila2 --> false
objPila1 != objPila2 --> true
• Método equals
– Disponible para todo objeto
– public boolean equals(Object obj)
– Comportamiento por defecto: this==obj
– Utilizado para implementar la igualdad de objetos.
El lenguaje de programación Java
21
Método equals
• Propiedades del método equals:
– reflexivo: x.equals(x) = true para todo x!=null
– simétrico: x.equals(y) = y.equals(x)
– transitivo: SI x.equals(y) AND y.equals(z)
ENTONCES x.equals(z)
– consistente: Llamadas repetidas a x.equals(y) debe
devolver el mismo valor si los objetos a los que referencian x
e y no han cambiado
– x.equals(null) debe devolver false.
El lenguaje de programación Java
22
11
Ejemplo de redefinición de equals
public class Punto {
// . . .
public boolean equals(Object otroObjeto){
// 1º comprobar si son idénticos
if (this == otroObjeto) return true;
// 2º si el argumento es nu
Comentarios de: Herencia. Clases abstractas. Genericidad (0)
No hay comentarios