Download Relaciones de composición y Herencia POO en Java Composición

Document related concepts
no text concepts found
Transcript
POO en Java
Relaciones de composición y
Herencia
Características:
• Composición “tiene un”
• Herencia “es un”
• Polimorfismo.
•Abstracción.
•Clases y objetos.
Java
Arrays y Cadenas
1
Java
Composición
2
Composición: clase Círculo
public class
class Punto
Punto {{
public
int xx;;
int
int yy;;
int
public Punto(
Punto(int
int x,
x, int
int y)
y) {{
public
this.x
.x == x;
x;
this
this
.y
=
y;
this .y = y;
}}
public Punto()
Punto() {{
public
// llamada
llamada al
al otro
otro constructor
constructor
//
this(-1,
(-1, --1);
1); }}
this
public
void
mostrar(){
public void mostrar(){
System.out.println(“x == ““ ++ xx +”
+” yy == ““ ++ y);
y); }}
System.out.println(“x
public static
static void
void main
main(String
(String args[])
args[]) {{
public
Punto pun1
pun1 == new
new Punto();
Punto();
Punto
Punto pun2
pun2 == new
new Punto(2,3);
Punto(2,3);
Punto
System.out.println( "visualizar
"visualizar datos
datos del
del punto"
punto" );
);
System.out.println(
pun1.mostrar();
pun1.mostrar();
pun2.mostrar();}}
pun2.mostrar();}}
Java
Arrays y Cadenas
Arrays y Cadenas
public class
class Circulo
Circulo {{
public
Punto origen;
origen;
Punto
int radio;
radio;
int
public Circulo(int
Circulo(int x,
x, int
int y,
y, int
int radio)
radio) {{
public
origen == new
new Punto(x,y);
Punto(x,y);
origen
this.radio
.radio == radio;
radio;
this
}}
public void
void mostrar()
mostrar() {{
public
origen.mostrar();
origen.mostrar();
System.out.println("radio == "" ++ radio);
radio);
System.out.println("radio
}}
public static
static void
void main(
main(String
String args[])
args[]) {{
public
Circulo cir
cir == new
new Circulo(5,
Circulo(5, 5,
5, 9);
9);
Circulo
System.out.println( "visualizar
"visualizar datos
datos del
del circulo"
circulo" );
);
System.out.println(
cir.mostrar();
}}
cir.mostrar();
}}
3
Java
Arrays y Cadenas
4
Herencia: La palabra
reservada extends
Tipos de programación
Cuando se crea un modelo de algo y luego se quiere
una versión más actualizada:
encapsulación
public class Empleado
{
String nombre;
Date anionac;
String puesto;
int categoría;
Basado en
objetos
+ clases
Basado en
clases
+ herencia
...
Orientado a
Objetos
public class jefe
{
String nombre;
¡datos duplicados!
Date anionac;
String puesto;
int categoría;
String departamento;
Empleado [] subordinados;
}
...
}
Java
Arrays y Cadenas
5
Java
Arrays y Cadenas
6
1
Herencia: La palabra
reservada extends
Herencia: La palabra
reservada extends
Se puede definir una clase a partir de otra definida
previamente.
La clase Jefe para tener todas las variables y
métodos de la clase Empleado no tiene que
definirlos, los hereda de la clase padre.
public class Empleado {
Todo lo que se tiene que definir después son
las características adicionales y especificar los
cambios que se quieren aplicar.
String nombre;
Date anionac;
String puesto;
int categoría; }
public class Jefe extends Empleado {
String departamento;
Arrays y Cadenas}
Empleado [ ] Java
subordinados;
7
Ejemplo de Herencia
Cuando una clase hereda sólo de otra clase,
se llama herencia simple.
Herencia simple hace que el código sea
reutilizable.
Mamífero
Primate
Java proporciona las interfaces que
proporcionan las ventajas de la herencia
múltiple y no presentan sus inconvenientes.
Canino
Chimpance
Java
Perro
Lobo
Arrays y Cadenas
9
Los constructores no se
heredan
Java
public class
class Persona
Persona {{
public
String nombre
nombre == "";
"";
String
int edad;
edad;
int
10
Persona
public Persona(String
Persona(String nom
nom,, int
int ed)
ed) {{
public
nombre == nom;
nom;
nombre
edad
=
ed;
edad = ed;
}}
Una clase no hereda los constructores de la
superclase.
Trabajador
public void
void mostrar()
mostrar() {{
public
System.out.println("Nombre: "+
"+ nombre);
nombre);
System.out.println("Nombre:
System.out.println("Edad:
"+ edad);
edad);
System.out.println("Edad: "+
}}
public static
static void
void main(String
main(String args[])
args[]) {{
public
Persona yo=
yo= new
new Persona(“Luis",
Persona(“Luis", 32);
32);
Persona
yo.mostrar();
yo.mostrar();
}
}
Sólo hay dos formas de que una clase tenga
constructor:
Utilizar el constructor por defecto.
Escribir uno o más constructores explícitos.
Arrays y Cadenas
Arrays y Cadenas
Herencia: clase Persona
Una subclase hereda de una superclase (la
clase padre), todos los métodos y las
variables.
Java
8
Herencia simple
Animal
Gorila
Es una buena manera de generar código fácil
de mantener y de actualizar. Las
modificaciones sobre la clase Empleado
repercuten sobre la clase Jefe únicamente
compilando.
Java
Arrays y Cadenas
11
}}
Java
Arrays y Cadenas
12
2
Herencia: clase Trabajador
Herencia: constructores
public class
class Trabajador
Trabajador extends
extends Persona
Persona {{
public
float sueldoHora;
sueldoHora;
float
int numHoras
numHoras;;
int
Persona
Persona
public Trabajador(
Trabajador(String
String nom,
nom, int
int ed
ed,, float
float suel,
suel, int
int num)
num) {{
public
super(nom,
(nom, ed);
ed); //
// llamada
llamada al
al constructor
constructor de
de Persona
Persona
super
sueldoHora == suel
suel;;
sueldoHora
numHoras == num
num;}
;}
numHoras
Trabajador
Trabajador
public double
double sueldo()
sueldo() {{
public
return sueldoHora
sueldoHora ** numHoras;
numHoras; }}
return
public static
static void
void main(
main(String
String args[])
args[]) {{
public
Trabajador yo=
yo= new
new Trabajador(“Luis",
Trabajador(“Luis", 32,
32, 200.5f,
200.5f, 45);
45);
Trabajador
yo.mostrar(); //
// se
se invoca
invoca al
al metodo
metodo heredado
heredado mostrar
mostrar
yo.mostrar();
double pelas
pelas == yo.sueldo();
yo.sueldo();
double
System.out.println("Cobra:
println("Cobra: "" ++ euros);
euros);
System.out.
}}
Java
Arrays y Cadenas
}}
Bedel
Bedel
13
Reescritura de un método
n
n
Arrays y Cadenas
Arrays y Cadenas
14
Ejemplo
La signatura de un método viene dada por su
nombre y el tipo y número de los parámetros
w El tipo devuelto no forma parte de la signatura
Cuando se reescribe un método en una clase
derivada
w La signatura debe ser la misma que el método
de la clase base
w El tipo devuelto debe ser el mismo que el del
método de la clase base
w El atributo de acceso del método de la clase
derivada tiene que ser igual o mas general que
el de la clase base (NO puede ser mas
restrictivo)
Java
Java
//En Persona
Persona redefinimos
redefinimos el
el método
método mostrar()
mostrar()
//En
public class
class Trabajador
Trabajador extends
extends Persona
Persona {{
public
float sueldoHora;
sueldoHora;
float
int numHoras;
numHoras;
int
public Trabajador(String
Trabajador(String nom,
nom, int
int ed,
ed, float
float suel,
suel, int
int num)
num) {{
public
super(nom, ed);
ed); //
// llamada
llamada al
al constructor
constructor de
de Persona
Persona
super(nom,
sueldoHora == suel;
suel;
sueldoHora
numHoras == num;}
num;}
numHoras
// sobrecarga
sobrecarga completa
completa de
de mostrar
mostrar
//
//
nombre
y
edad
son
atributos heredados
heredados de
de Persona
Persona
// nombre y edad son atributos
public void
void mostrar()
mostrar() {{
public
System.out.println("Nombre: "+
"+ nombre);
nombre);
System.out.println("Nombre:
System.out.println("Edad: "+
"+ edad);
edad);
System.out.println("Edad:
System.out.println("Sueldo por
por hora:
hora: "+
"+ sueldoHora);
sueldoHora);
System.out.println("Sueldo
System.out.println("Horas trabajadas:
trabajadas: "+
"+ numHoras);}}
numHoras);}}
System.out.println("Horas
15
Sobrecarga de método
Java
Arrays y Cadenas
16
Sobrecarga de método
Sobrecarga parcial ampliando el método
heredado
public class
class Trabajador
Trabajador extends
extends Persona
Persona {{
public
float sueldoHora
sueldoHora;;
float
int numHoras;
numHoras;
int
public Trabajador(String
Trabajador(String nom
nom,, int
int ed,
ed, float
float suel,
suel, int
int
public
num) {{
num)
w El método de la subclase puede llamar al
super(nom, ed
ed);
); //
// llamada
llamada al
al constructor
constructor de
de Persona
Persona
super(nom,
sueldoHora == suel;
suel;
sueldoHora
numHoras == num;}
num;}
numHoras
// sobrecarga
sobrecarga parcial
parcial de
de mostrar
mostrar
//
// nombre
nombre yy edad
edad son
son atributos
atributos heredados
heredados de
de Persona
Persona
//
public
void
mostrar()
{
public void mostrar() {
super.mostrar(); //llamada
//llamada al
al método
método de
de la
la clase
clase padre
padre
super.mostrar();
System.out.println("Sueldo por
por hora:
hora: "+
"+ sueldoHora
sueldoHora);
);
System.out.println("Sueldo
System.out.println("Horas
trabajadas:
"+
numHoras);}
System.out.println("Horas trabajadas: "+ numHoras);}
método de la superclase
}}
Java
Arrays y Cadenas
17
Java
Arrays y Cadenas
18
3
La clase genérica Object
La clase genérica Object
Object define un conjunto de métodos útiles,
que pueden ser redefinidos en cada clase. En
particular:
Todas las clases en Java heredan
implícitamente de la clase Object. De
esta forma, Object es la raiz de la
jerarquía de herencia (de
implementación) en Java.
n
n
Java
Arrays y Cadenas
public boolean equals(Object o): Permite definir el
criterio de igualdad utilizado para los objetos de
una determinada clase (el operador ==
únicamente chequea la igualdad de referencias).
En Object, equals se define directamente como la
identidad de referencias.
public String toString(): Permite decidir la
representación externa de un objeto como una
cadena. Por defecto es el valor de su referencia,
etiquetada con el nombre de la clase.
19
La clase genérica Object
Java
Arrays y Cadenas
20
API de Object
Method Summary
toString()
equals()
protected
Object
Object
boolean
protected
void
Class
int
no se necesita extends para heredar de Object
String
Java
Arrays y Cadenas
21
Ejemplo
clone()
Creates and returns a copy of this object.
equals (Object obj)
Indicates whether some other object is "equal to" this one.
finalize()
Called by the garbage collector on an object when garbage collection
determines that there are no more references to the object.
getClass()
Returns the runtime class of an object.
hashCode()
Returns a hash code value for the object.
toString()
Returns a string representation of the object.
Java
Arrays y Cadenas
22
Ejemplo
public class Alumno{
String nombre;
String apellidos;
public Alumno(String nombre, String apellidos){
this.nombre= nombre;
this.apellidos= apellidos;
}
public boolean equals(Alumno al){
if (apellidos.equals(al.apellidos))
return true;
else return false;
}
Java
Arrays y Cadenas
23
public static void main(String args[]) {
Alumno alum = new Alumno("Julian", "Fdez");
Class tipoObjeto = alum.getClass();
System.out.println("nombre de la clase: " +
tipoObjeto .getName());
Alumno alum2 = alum;
alum2.apellidos = "Rodriguez ";
System.out.println("son el mismo objeto?:"+
(alum==alum2));
alum2 = new Alumno("Antonio", "Rodriguez ");
System.out.println("son iguales los
objetos?:"+ alum.equals(alum2));
}}
Java
Arrays y Cadenas
24
4
Copias de Objetos
clone( )
La asignación en Java simplemente copia
A'
A
la referencia
Copia superficial:
15
B
C
23
"abc"
Copia en profundidad:
A
B
23
"abc"
15
C
42
Java
15
A'
B'
23
"abc"
42
15
C'
Crea un objeto que es copia “superficial” del
objeto actual independientemente de su tipo.
El tipo objeto a copiar debe haber declarado
que es susceptible de copia implementando el
interfaz vacío Clonable
Es un método protegido de Object, por tanto
para que pueda ser invocado desde otro
paquete hay que redeclararlo como público y
simplemente invocar a la clase base.
42
Arrays y Cadenas
25
clone( )
Java
Arrays y Cadenas
26
clone( )
public class
class ClaseClonable
ClaseClonable
public
implements Cloneable
Cloneable {{
implements
// Otro
Otro código
código de
de la
la clase
clase
//
public Object
Object clone
clone ()
()
public
throws CloneNotSupportedException
CloneNotSupportedException
throws
{{
return super.clone();
super.clone();
return
}}
}}
Java
Arrays y Cadenas
27
clone( )
public abstract class Transaction implements
Cloneable{
private long amount;
private Date date;
public Object clone(){
Object o = null;
try{
o = super.clone(); //copia superficial
}
catch(CloneNotSupportedException e){
throw new InternalError(); }
return o;
Java
Arrays y Cadenas
28
}
clone( )
Si los miembros de una clase son otros
objetos que necesiten “copia profunda”
habrá que añadir el código necesario
w Llamada a los métodos clone() de cada uno de
los objetos implicados para crear una copia
Java
Arrays y Cadenas
29
public abstract class Transaction
implements Cloneable{
private long amount;
private Date date;
public Object clone(){
Transaction t = null;
try{
t = (Transaction)super.clone();//superf
t.date = (Date)t.date.clone();//profund
}
catch(CloneNotSupportedException e){
throw new InternalError(); }
return t;
Java
Arrays y Cadenas
30
}
5
clone( )
Ejemplo
Reglas generales
n
n
Implementar el interfaz Cloneable si se desea que
la clase se pueda copiar
No utilizar constructores en la implementación de
clone() si no llamadas a los métodos clone() de
los otros objetos a copiar
w Puede existir problemas en el tipo de objeto creado
n
Todas las subclases de una clase Clonable
también son susceptibles de ser clonadas.
w Deben reescribir el método clone()
Java
Arrays y Cadenas
31
Ejemplo (cont.)
public class
class Alumno
Alumno implements
implements Cloneable
Cloneable {{
public
String nombre;
nombre;
String
String
apellidos;
String apellidos;
public Alumno(String
Alumno(String nombre,
nombre, String
String apellidos){
apellidos){
public
this.nombre= nombre;
nombre;
this.nombre=
this.apellidos= apellidos;
apellidos;
this.apellidos=
}}
public
boolean
equals
(Alumno
al){
public boolean equals (Alumno al){
if (apellidos.equals(al.apellidos))return
(apellidos.equals(al.apellidos))return true
true;;
if
else return
return false;
false;
else
}}
public Object
Object clone
clone ()
() throws
throws
public
CloneNotSupportedException{
CloneNotSupportedException{
return super.clone();
super.clone();
return
}}
public String
String toString
toString(){
(){
public
return nombre
nombre
Java
apellidos ++ "" ";
"; 32}}
return
++ ""Arrays
"" ++y Cadenas
apellidos
Referencia estática
public static
static void
void main(String
main(String args[])
args[]) {{
public
Alumno alum
alum == new
new Alumno("Julian",
Alumno("Julian", ""Fdez");
Fdez");
Alumno
Class tipoObjeto
tipoObjeto == alum.
alum.getClass();
getClass();
Class
System.out.println
.out.println("nombre
("nombre de
de la
la clase:"
clase:" ++tipoObjeto
tipoObjeto.getName());
.getName());
System
Alumno alum2
alum2 == alum;
alum;
Alumno
alum2.apellidos == "Rodriguez";
"Rodriguez";
alum2.apellidos
System.out.println
.out.println("son
("son el
el mismo
mismo objeto?:"+
objeto?:"+ ((alum
alum==alum2));
==alum2));
System
alum2 == new
new Alumno("Antonio",
Alumno("Antonio", "Rodriguez");
"Rodriguez");
alum2
System.out.println
.out.println("son
("son iguales
iguales os
os objetos?:"+
objetos?:"+
System
alum.equals(alum2));
.equals(alum2));
alum
try {{ alum2
alum2 == (Alumno)alum.clone();
(Alumno)alum.clone();
try
}catch (CloneNotSupportedException
(CloneNotSupportedException e){
e){
}catch
System.out.println("no tiene
tiene implementada
implementada la
la clonacion");
clonacion");
System.out.println("no
}}
alum.nombre="Fran";
alum.nombre="Fran";
alum2.nombre="Moises";;
alum2.nombre="Moises"
System.out.println
.out.println("objetos:
("objetos: "+
"+ alum
alum ++ alum2);
alum2);
System
}}
Java
Arrays y Cadenas
33
}}
Referencia dinámica
La referencia estática se fija en tiempo de
compilación
Rectangle r = new Rectangle();
Circle c = new Circle();
...
c = r; //Error
Java
Arrays y Cadenas
34
Enlace dinámico
Programador es un Empleado
Empleado
n
e
mit
per
Se
extends
Programador
El método a ejecutarse se determina en
ejecución en función de la referencia
dinámica (no de la estática)
Empleado e = new Programador();
Empleado es referencia estática
Revisada por el compilador
Programador es referencia dinámica
Sus métodos se eligen en tiempo
de ejecución
Java
Arrays y Cadenas
35
Java
Arrays y Cadenas
36
6
Enlace dinámico
Cuenta
CCorriente
Cuenta [ ]accArray = new Cuenta[10];
accArray[0] = new CAhorro();
accArray[1] = new CCorriente();
...
retirar()
CAhorro
retirar()
Enlace dinámico
class Shape{
Shape{ ...
... double
double getArea(){...};}
getArea(){...};}
class
class Rectangle
Rectangle extends
extends Shape{
Shape{ ...
... double
double
class
getArea(){...};}
getArea(){...};}
class Triangle
Triangle extends
extends Shape
Shape{{ ...
... double
double
class
getArea(){...};}
getArea(){...};}
Shape s;
s; Rectangle
Rectangle r;
r; Triangle
Triangle t;
t;
Shape
// ...
...
//
if
(/*...*/)
s
=
r;
else
s
=
t;
if (/*...*/) s = r; else s = t;
double answer
answer == s.getArea();
s.getArea(); //
// ¿Cual
¿Cual ejecuta?
ejecuta?
double
accArray[i].retirar()
retirar()
enlace dinámico
s; //
// ¿legal?
¿legal?
rr == s;
Java
Arrays y Cadenas
Enlace dinámico
37
Persona
public static
static void
void main(String
main(String args[])
args[]) {{
Trabajador
public
Persona per;
per;
Persona
Trabajador yo=
yo= new
new Trabajador("Balta",
Trabajador("Balta", 99,
99, 200.5f,
200.5f, 45);
45);
Trabajador
per == yo;
yo;
// Asignacion
Asignacion legal
legal
per
//
// se
se ejecuta
ejecuta el
el método
método mostrar
mostrar de
de Trabajador
Trabajador
//
per.mostrar(); //
// per
per se
se trata
trata como
como cualquier
cualquier Trabajador
Trabajador
per.mostrar();
pelas == per.sueldo();
per.sueldo();
pelas
//
Ilegal
(sueldo
se
define
en
Trabajador)
// Ilegal (sueldo se define en Trabajador)
boolean b1,
b1, b2;
b2;
boolean
b1 == (per
(per instanceof
instanceof Persona);
Persona); //
// True
True
b1
b2 == (per
(per instanceof
instanceof Trabajador);
Trabajador); //
// True
True
b2
System.out.println("b1:
"+
b1
+
"
b2:
"+ b2);
b2);
System.out.println("b1: "+ b1 + " b2: "+
}
}
Java
Arrays y Cadenas
39
La palabra reservada super
n
n
n
Arrays y Cadenas
Arrays y Cadenas
38
Enlace dinámico
Nota:
Nota:
En
En C++
C++ sólo
sólo hay
hay enláce
enláce dinámico
dinámico
en
en los
los métodos
métodos virtual
virtual
En
En Java,
Java, todos
todos los
los métodos
métodos son
son
virtuales
virtuales
Java
Arrays y Cadenas
40
La palabra reservada super
Una clase utiliza super para apuntar a su
superclase.
Super se utiliza para apuntar a los
miembros de la superclase.
Los métodos de la superclase se invocan
como si el objeto fuera parte de la
subclase.
Java
Java
41
public class Empleado{
private String nombre;
private int salario;
public String getDetails(){
return "Nombre: "+ nombre + "\nsalario: "
+ salario; }}
public class Jefe extends Empleado {
private String departamento;
public String getDetails(){
return super.getDetails()+
"\nDepartamento: " + departamento;
//llama al método del padre
}}
Java
Arrays y Cadenas
42
7