PPO
ppo
< >
MATERIALES BASADOS EN EL TRAAJO DE DIFERENTES AUTORES:
M.Carmen Fernández Panadero, Raquel M. Crespo García
Carlos Delgado Kloos, Natividad Martínez Madrid
1
PPO
PPO
< >
MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES:
M.Carmen Fernández Panadero, Raquel M. Crespo García
Carlos Delgado Kloos, Natividad Martínez Madrid
2
3
Objetivos
• Definir los conceptos básicos de la
programación basada en objetos
– Clases, objetos
– Miembros (atributos, métodos)
– Abstracción y ocultación de información
• Describir relación entre objeto y clase
4
• Crear un objeto sencillo y modelar
– sus características (por medio de atributos)
– su comportamiento (por medio de métodos)
5
Clases y objetos
Encapsulación de objetos
Abstracción funcional
Abstracción de datos
Miembros de una clase (atributos y métodos)
Paso de mensajes
Sobrecarga de métodos
Constructores
Modificadores y acceso
6
7
8
¿Qué es un objeto?
• Es una forma de agrupar un conjunto de
datos (estado) y de funcionalidad
(comportamiento) en un mismo bloque
de código que luego puede ser
referenciado desde otras partes de un
programa
• La clase a la que pertenece el objeto
puede considerarse como un nuevo tipo
de datos
9
Ejemplo
Clase Objetos
Estado
Constructor
Comportamiento
• this referencia al objeto de la clase actual
10
Ejercicio 1
• Implementa la clase Bicicleta, que tiene tres atributos,
velocidadActual, platoActual y piñonActual, de
tipo entero y cuatro métodos acelerar(), frenar(),
cambiarPlato(int plato), y cambiarPiñon(int
piñon), donde el primero dobla la velocidad actual, el segundo
reduce a la mitad la velocidad actual, y el tercero y cuarto ajustan el
plato y el piñón actual respectivamente según los parámetros
recibidos. La clase debe tener además un constructor que inicialice
todos los atributos.
• Crea dos objetos de la clase bicicleta: miBicicleta y
tuBicicleta
11
Encapsulación de objetos
• Encapsulación: describe la vinculación de un
comportamiento y un estado a un objeto en particular.
• Ocultación de información: Permite definir qué partes
del objeto son visibles (el interfaz público) que partes son
ocultas (privadas)
•La llave de contacto es un interfaz público del
mecanismo de arranque de un coche
•La implementación de cómo arranca realmente es
privada y sobre ella sólo puede actuar la llave de
contacto
12
El objeto puede cambiar y su interfaz pública ser compatible
con el original: esto facilita reutilización de código
13
14
15
16
17
Ejemplo
Clase Coche Clase Motor
Clase Rueda
Paso de
mensajes
18
19
20
21
Sobrecarga (Overloading)
¿Para qué sirve?
Clase Objetos
Sobrecarga
Son métodos distintos porque
aunque tengan el mismo nombre
tienen distintos arg umentos.
Tienen distinta fun cionalidad
22
Ejercicio2
• Sobre la claseBicicleta, implementa los
método sobrecargados cambiarPlato (), y
cambiarPiñon (), que no reciben argumentos y
que cambian el plato actual y el piñón actual a
un valor pordefecto,en concreto, 1.
23
24
Constructores
Array de objetos de la clase Coche
Sobrecarga de constructores
25
Ejercicio 3
• Sobre la claseBicicleta, implementa un
constructor adicional que no recibe parámetros
y que inicializa la velocidad actual a 0, y el
plato actual y el piñón actual a 1.
26
27
Modificadores y acceso
Static (miembros estáticos)
Atributo estático
Otros ejemplos
Atributo estático
=> -231
… => 231-1
Método estático:Tiene acceso a atributos estáticos
No necesitamos crear instancias
http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html
28
Modificadores y acceso
Static. Algunas reglas
– Los miembros estáticos se invocan con:
NombreClase.metodoEstatico();
NombreClase.atributoEstatico;
– Para acceder a los miembros no estáticos necesitamos
disponer de una instancia (objeto) de la clase
NombreClase nombreObjeto = new NombreClase();
– Los miembros no estáticos se invocan con:
nombreObjeto.metodoNormal();
nombreObjeto.atributoNormal;
29
– Cuando invocación (llamada) a un miembro estático de la clase
se realiza dentro de la propia clase se puede omitir el nombre
de la misma. Es decir podemos escribir:
metodoEstatico(); en lugar NombreClase.metodoEstatico();
atributoEstatico; de: NombreClase.atributoEstatico;
30
Acceso
Métodosget() y set()
• Los atributos de una clase son generalmente privados para
evitar que puedan ser accesibles / modificables desde
cualquier otra clase.
• A veces nos interesa que algunas clases determinadas sí
puedan acceder a los atributos.
• Uso de métodos get() y set()
31
Ejercicio 4
• Sobre la clase Bicicleta, implementa los
métodos get() y set()necesarios para poder
acceder y modificar todos los atributos.
32
33
Paquetes
• Un paquete agrupa clases (e interfaces)
• Las jerarquías de un paquete se corresponden con las
jerarquías de directorios
• Para referirse a miembros y clases de un paquete se utiliza la
notación de separarlos por puntos.
– Ej: Cuando importamos paquetes de clases matemáticas
import java.math.BigDecimal;
– La clase BigDecimal está en el directorio java/math dentro del JDK
– No es necesario importar todas las clases: paquete java/lang
– String
– Integer
– NullPointerException
– ArrayIndexOutOfBoundsException
34
Paquetes
• ¿Cómo crear mis propios paquetes?
– Almaceno mis clases en un directorio con el nombre del paquete
– Pongo al principio de todas las clases que
pertenezcan al paquete la instrucción
package MiPropioPaquete;
– Si quiero importar las clases de ese paquete desde
otras clases y/o proyectos, pongo al principio de cada
clase
import MiPropioPaquete.Clase1
35
Programación de Sistemas
Programación ORIENTADA a Objetos
Julio Villena Román
<
[email protected] >
MATERIALESBASADOSEN EL TRABAJODE DIFERENTESAUTORES
:
M.CarmenFernández Panadero, Raquel M. Crespo García
Carlos Delgado
Kloos, Natividad Martínez Madrid
36
Escenario V:
Reutilizar código. Herencia
• Una vez que eres capaz de crear tus propias clases estás preparado para
trabajar en equipo y reutilizar código de tus compañeros. Tu equipo te
proporciona un conjunto de clases y te pide que crees especializaciones o
generalizaciones de las mismas
• Objetivo:
– Ser capaz de crear una clase derivada añadiendo algunas características
(atributos) y comportamiento (métodos) a una clase existente.
– Ser capaz de extraer todo el código común de un conjunto de clases similares
para agruparlo en una nueva clase padre para que sea más fácil de mantener.
– Ser capaz de crear objetos, y referenciar y acceder a sus atributos y
métodos dependiendo de su posición en la jerarquía de herencia y sus
modificadores
• Plan de trabajo:
– Memorizar la nomenclatura relacionada con herencia
– Memorizar la sintaxis de java relacionada con la herencia (extends), con la referencia
(super) y con modificadores de acceso avanzados (protected)
– Conocer mecanismos básicos de herencia como ocultación de atributos, sobreescritura
de métodos ,saber para qué sirven y cómo se usan
37
Con t en idos
► Conceptos básicos de herencia
► Jerarquía de herencia
► Reescritura I: Ocultación de atributos
► Reescritura II: Redefinición de métodos
► Constructores de clasesderivadas
► Polimorfismo
► El modificador final
38
Herencia
¿Qué es?¿Para qué sirve?
• Es un mecanismo para la reutilización de software
• Permite definir a partir de una clase otras clases
relacionadas que supongan una:
– Especialización (la clase Coche como especialización de
Vehículo)
• Escenario: Tenemos que desarrollar una nueva clase que se parece mucho a una que
tenemos pero necesita información (características y comportamiento) adicional.
• Solución (subclase, clase hija o clase derivada): Creamos una clase derivada y
añadimos nueva funcionalidad sin tener que reescribir el código común.
– Generalización (la clase Vehículo como generalización de
coche).
39
• Escenario: Tenemos un conjunto numeroso de clases muy similares con código
que se repite y es difícil de actualizar y mantener (ejemplo hay que añadir una letra
al número de serie)
• Solución (superclase, clase padre o clase base): Movemos el código que se
repite a un único sitio
40
41
42
Herencia
Declaración de clases derivadas
• La sintaxis para declarar clases derivadas es:
class ClaseDerivada extends ClaseBase { ... }
public class Persona { ... }
Persona public class Alumno extends Persona { ... }
public class Empleado extends Persona { ... }
public class Profesor extends Empleado { ... }
Alumno Empleado
public class Bedel extends Empleado { ... }
Profesor Bedel
43
44
Herencia
¿ Cómo se usa? Ej.: Persona.java
• protected accesible
desde las subclases
45
Herencia
¿ Cómo se usa? Ej.: Alumno.java
• super acceder a
atributos o métodos de
la superclase
[email protected] 2010
46
Herencia
¿ Cómo se usa? Ej.: Prueba.java
Salida por pantalla
47
Herencia
¿ Qué pasa si…
?
• Defino el atributo
nombrede Personacomoprivate.
• Se hereda, pero no podemos acceder a él, salvo que
implementemos métodos para ello (p.ej.
getNombre ())
• Implemento el constructor de la subclase asignando
los valores a los atributos directamente en lugar de
llamar asuper
• No aprovecho la potencia de la reutilización
código
de
• En este caso es viable porque los atributos se han definido
comoprotected(¡¡no siempre será así !!)
48
49
Ejercicio 5
• Partiendo de la clase Bicicleta, la cual tiene tres atributos,
velocidadActual, platoActual y piñonActual,
de tipo entero y cuatro métodos acelerar(), frenar(),
cambiarPlato(int plato), y cambiarPiñon(int
piñon), implementa las clases BicicletaMontaña y
BicicletaTandem.
• BicicletaMontaña tiene un atributo suspension de
tipo entero y un método cambiarSuspension(int
suspension)
• BicicletaTandem tiene un atributo numAsientos de
tipo entero.
• Crear los constructores de estas clases para inicializar todos
sus atributos, haciendo uso de super
50
51
52
Herencia
Reescritura (o sobrescritura)
• Modificación de los elementos de la clase
base dentro de la clase derivada
• La clase derivada puede definir:
–
Un atributo con el mismo nombre que uno de
la clase base → Ocultación de atributos
–
Un método con la misma signatura que uno
de la clase base → Redefinición de métodos
• Lo más usual cuando se produce reescritura
es que se reescriba un método
53
54
Reescritura I (Shadowing)
Ocultación de atributos. Ejemplo
class Persona {
public String nombre = "Juan";
}
class Alumno extends Persona {
public int nombre = 10003041;
}
class Test {
public static void main (String[] args) {
Alumno a = new Alumno ();
Persona p = a;
System.out.println(p.nombre); Imprime “Juan”
System.out.println(a.nombre)
;
} }
Imprime 10003041
55
Reescritura I (Shadowing)
Ocultación de atributos
• Si definimos en una subclase un atributo del
mismo nombre y tipo que en la superclase, la
de la superclase queda oculta.
• Podemos acceder a la variable de la subclase
o de la superclase utilizando this y sup er.
56
Reescritura I (Shadowing)
Ocultación de atributos
clase "Abuela" Transporte String nombre = "terrestre" clase padre
Tren Vehiculo String nombre = "turismo"
clase hija Moto Coche String nombre = "Ferrari"
• ¿Cómo acceder a variables ocultas (desde la clase hija)?
variables
– nombre (nombre del coche)
clase hija:
– this.nombre (nombre del coche) visibles
– super.nombre (nombre del vehículo)
– ((Vehiculo)this).nombre (nombre del vehículo) Variables
– super.super.nombre (Mal) clases padre
57
ocultas
– ((Transporte)this).nombre (nombre del transporte)
Reescritura II (Overriding)
Redefinición de métodos. ¿Qué es?
• La reescritura de métodos es útil para
– Ampliar la funcionalidad de un método
– Particularizar la funcionalidad de un método a la clase derivada
• Si definimos en una subclase un método con la misma
signatura (nombre + tipo y número de parámetros) que en
la superclase el de la superclase queda oculto.
• ¿Cómo acceder a métodos ocultos?
– arrancar() (ejecuta el método arrancar del coche) Métodos clase hija:
– this.arrancar() (ejecuta el método arrancar del coche) visibles
58
– super.arrancar() ( método arrancar del vehículo) métodos clases padre:
– super.super.nombre (Mal) ocultos
59
60
61
Reescritura II (Overriding)
Redefinición de métodos
• Al mandar un mensaje a un objeto, el
método seleccionado:
– Depende de la clase real de la que el
objeto es una instancia
– No de la clase de referencia a la que esté
asignado, como en el caso de los atributos
62
63
Ejercicio
6
• Sobreescribe
el método acelerar (), deBicicleta , en las
subclasesBicicletaMontaña y BicicletaTandem , de
tal forma que en la primera acelerar suponga triplicar la velocidad
actual y en la segunda cuadruplicar la velocidad actual.
• Crea dosobjetos de las clases
BicicletaMontaña y
BicicletaTandem e invoca sobre ellos el método
acelerar() , ¿cuál es el resultado?
• Desde estos objetos que has creado, ¿cómo accederías a la
implementación del métodoacelerar() , en la clase
Bicicleta ?
64
65
66
67
Constructores y herencia
1. Si no se indica explícitamente, Java inserta
automáticamente una llamada a super() en
la primera línea del constructor de la clase
derivada
public Alumno (String nombre, String apellidos,
int anyoNacimiento, String grupo,
char horario) {
// aquí inserta Java una llamada (invisible) a super()
this.nombre = nombre;
this.apellidos = apellidos;
this.anyoNacimiento = anyoNacimiento;
this.grupo = grupo;
this.horario = horario;
}
68
Constructores y herencia
2. Indicándolo explícitamente
public Alumno (String nombre, String apellidos,
int anyoNacimiento, String grupo,
char horario) {
super(nombre, apellidos, anyNacimiento);
this.grupo = grupo;
this.horario = horario;
}
69
70
71
Polimorfismo
Ejemplo
• Alumno, Profesor y Bedel.
• Creamos unarray de Personadonde incluimos objetos de
Alumno, Profesor y Bedel.
• Al invocar al método imprimir(), sobrescrito en las clases
Alumno, Profesory Bedel, sobre elarray de Persona, cada
objeto utilizará su propia implementación del método
Persona[] grupo = {new Alumno(…), new
Profesor(…), new Bedel(…), new Alumno(…)};
for (int i=0; i<grupo.length
; i++){
grupo[i].imprimir();
}
72
Polimorfismo
Ligadura dinámica
• Se llama al método correcto, aunque nos
estemos refiriendo al objeto de la subclase a
través de una referencia a la superclase
• Este mecanismo se llama “ligadura dinámica”
– permite detectar en tiempo de ejecución cuál es el
método adecuado para llamar
• El compilador no genera el código para llamar
al método en tiempo de compilación
73
– Genera código para calcular qué método llamar
74
Ejercicio7
• Crea unarray de la claseBicicleta, que contenga objetos
de las clasesBicicleta, BicicletaMontañay
BicicletaTandem
• Invoca el métodoacelerar()sobre cada uno de los
objetos aprovechando las propiedades de polimorfismo y
ligadura dinámica
75
Modificadores y acceso
Final
• Si no se quiere que las clases derivadas
sean capaces de modificar un método o
un atributo de la clase base, se añade a
ese método o atributo la palabra
reservada final
76
77
78
Programación de Sistemas
Programación ORIENTADA a Objetos (II)
Julio Villena Román
<
[email protected] >
MATERIALES
BASADOSEN EL TRABAJODE DIFERENTES :
AUTORES
M.CarmenFernández Panadero, Raquel M. Crespo García
Carlos Delgado
Kloos, Natividad Martínez Madrid
79
Con t en idos
► Casting. Compatibilidadde tipos
► Clases y métodos abstractos
► Interfaces
80
Casting (conversión)
Sintaxis y tipos
• Sintaxis:(tipo) identificador
• Dos tipos de casting:
–
Widening o upcasting: Una subclase se utiliza
como instancia de la superclase. Es implícito.
–
Narrowing o downcasting: La superclase se
utiliza como instancia de una subclase.
Conversión explícita.
81
• Sólo se puede hacer casting entre clases padre
e hija no entre clases hermanas
82
Casting (conversión)
Widening o upcasting
1. Compatibilidad hacia arriba
(upcasting)
– Un objeto de la clase derivada siempre se
podrá usar en el lugar de un objeto de la
clase base (ya que se cumple la relación
“es-un”)
Persona p = new Alumno();
83
Casting (conversión)
Narrowing o downcasting
2. Compatibilidad hacia abajo (downcasting)
– No se produce por defecto, ya que un objeto
de la clase base no siempre es un objeto de la
clase derivada
Alumno a = new Persona(); // error
– Sólo es posible en los casos en los que el objeto
de la clase base realmente sea un objeto de la
clase derivada
– Estos casos se tendrán que indicar
explícitamente con un casting (con una
asignación explícita de la clase).
84
85
86
Casting (conversión)
El operador instanceOf
• Sintaxis:
objeto instanceOf clase
– Comprueba si un objeto es realmente de la
clase derivada
• Ejemplo:
public Alumno comprueba (Persona p) {
Alumno a = null;
if (p instanceOf Alumno)
a = (Alumno) p;
return a;
}
87
Clases abstractas
¿Qué son?
• Aquellas que tienen al menos un método
abstracto (sin implementar, sin código).
• Declara la estructura de una determinada
abstracción, sin implementar completamente
cada método
Mensaje
Email SMS Fax MensajeVoz
88
Clases abstractas
Características
• Las clases y métodos abstractos se definen
con la palabra clave abstract
public abstract class Figura {...}
• No pueden llevar el modificador abstract:
– los constructores
– los métodos estáticos
– los métodos privados
89
Clases abstractas
Características
• No podemos crear objetos de una clase abstracta
– Pueden existir referencias a clases abstractas
– Pero apuntarán a objetos de clases derivadas de la clase
abstracta.
Figura fig = new Rectangulo(2,3);
• Sí podemos heredar de una clase abstracta
• En una clase abstracta puede haber
– Metodos abstractos
– Métodos no abstractos
90
Clases abstractas
¿Para qué sirven?: Implementaciones parciales
• Las clases abstractas suelen usarse para representar
clases con implementaciones parciales
– Algunos métodos no están implementados pero sí
declarados
• El objetivo de las implementaciones parciales es dar
una interfaz común a todas las clases derivadas de
una clase base abstracta
– Incluso en los casos en los que la clase base no tiene la
suficiente información como para implementar el método
91
Clases abstractas
Métodos abstractos
• Métodos declarados pero no implementados
en las clases abstractas
public abstract tipoDevuelto nombre (listaParametros);
– Se declaran con la palabra reservada abstract
• Las clases que hereden de la clase abstracta
deberán implementar los métodos abstractos
de la superclase
– O serán abstractas ellas también
NOTA: No hay llaves!! No
están implementados: después
92
de la declaración se pone solo un
;
93
Clases abstractas
¿Cómo se usan? Ejemplo
public abstract class Figura {
protected double dim1;
protected double dim2;
public Figura(double dim1, double dim2) {
this.dim1 = dim1;
this.dim2 = dim2;
}
public abstract double area();
}
public class Rectangulo extends Figura {
public Rectangulo(double dim1, double dim2) {
super(dim1,dim2);
}
public double area() {
return dim1*dim2;
}
}
94
Ejercicio 8
• Partiendo de la clase Bicicleta, la cual tiene tres
atributos, velocidadActual, platoActual y
piñonActual, de tipo entero y cuatro métodos
acelerar(), frenar(), cambiarPlato(int
plato), y cambiarPiñon(int piñon), implementa
la clase abstracta Vehículo, la cual será una superclase de
Bicicleta
• Piensa qué atributos y métodos serán propios de
Bicicleta y cuáles pueden heredarse de Vehículo,
teniendo en cuenta que además de Bicicleta existirán
las subclases Coche y Camión
95
• Piensa qué métodos deben ser abstractos y cuáles no en la
clase Vehículo
96
97
98
Interfaces
¿Qué son?
• Una interfaz es un elemento puramente de
diseño
– ¿Qué se quiere hacer?
• Una clase (incluidas las abstractas) es una
mezcla de diseño e implementación
– ¿Qué se quiere hacer y cómo se hace?
• Distintas clases pueden implementar la
interfaz de distintas formas
99
Interfaces
Declaración
• Sintaxis:
public interface nombreInterfaz {
static final tipo CONSTANTE = valor;
tipoDevuelto nombreMetodo(listaParam);
}
NOTA 1: No hay llaves!! No está implementado
despuésde la declaraciónse pone sólo un ;
NOTA2: Las constantes y métodos en las
interfaces son siempre públicos
(no hay necesidad de hacerlo explícito
)
100
Interfaces
Implementación
• Si una clase implementa una interfaz, quiere decir que
implementa todos los métodos abstractos de esa interfaz
• Esto se representa con la palabra reservada
implements:
public class Clase implements Interfaz {...}
101
Interfaces
¿Para qué sirven? Herencia múltiple
metodoA metodoB metodoC
Class A Interface B Interface C
extends implements implements
Class C
• En Java una clase hereda de una única superclase
o No existe la herencia múltiple
• Pero puede implementar varios interfaces
102
Interfaces
¿Cómo se usan?
Figura Dibujable
•area() •dibujar()
extends implements
Círculo Rectángulo
•area() •area()
•dibujar() •dibujar()
public abstract class Figura {…}
public interface Dibujable {…}
public class Circulo extends Figura implements Dibujable
public class Rectangulo extends Figura implements Dibujable
103
Ejercicio9
• Implementa la interfaz , la cual
Imprimible
contiene el método
imprime ()que no
devuelve ningún valor
.
• La claseBicicleta implementa la interfaz
Imprimible de tal forma que se imprima por
pantalla la velocidad actual el piñón actual y el
plato actual.
104
Interfaces
Herencia de interfaces y polimorfismo
• Las interfaces también pueden tener una
jerarquía de herencia
• Los métodos que deberán incluir las clases
que implementen las interfaces se van
acumulando siguiendo la jerarquía
• Las interfaces también dan soporte a la
resolución dinámica de métodos durante la
ejecución (ligadura dinámica)
105
Ejercicio10
• Implementa la interfaz
Definir , la cual
contiene el método
getAtributos () que
devuelve el valor de los atributos de un objeto.
La interfazImprimiblehereda deDefinir .
• ¿Qué cambios hay que hacer en la interfaz
Imprimible ? ¿Y en la clase
Bicicleta ?
106
Resumen Orientación a objetos
• Clase (concreta)
– Todos los métodos implementados
• Clase abstracta
– Al menos un método no implementado,
(sólo declarado)
– modificador abstract
• Interfaz
– Nada de implementación
– palabra reservada: interface
107
Resumen Orientación a objetos
• Clase (concreta o abstracta)
– puede extender (extends) a una sola clase
(herencia simple)
– puede implementar (implements) uno o
más interfaces (herencia múltiple)
• Interfaz
– puede extender (extends) a uno o más
interfaces
108
clase metodo atrib
MODIFICADORE
S
acceso public
Accesible desde cualquier otra clase
(friendly Accesible sólo desde clases de su propio paquete
)
protecte Accesible desde la clase y sus subclases
d
Accesibles sólo dentro de la clase
private
otros
No se pueden
abstract instanciar
Son para
heredar de
ellas
Al menos 1
método
abstracto
No tiene código
Se implementa en las
subclases o clases hijas
No se puede No se puede ocultar No se
final heredar de Es cte y no puede ser modificado en las clases cambiar s
ellas. Es la hijas es cte.
hoja en el Se suele u
árbol de combinac
herencia static
Clase de Es el mismo para todos los objetos de la Es la mi
static nivel clase. structuraSe utiliza: del lenguaje todos los
copy máximo. de la clase
righ NombreClase.metodo();
mcfp
Se aplica a
Se utiliza
@it classes NombreC
t internas uto; 100
E
.uc3m.es