Anda di halaman 1dari 100

Programacin de Sistemas

Programacin Orientada a Objetos

Julio Villena Romn


<jvillena@it.uc3m.es>

MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES:


M.Carmen Fernndez Panadero, Raquel M. Crespo Garca
Carlos Delgado Kloos, Natividad Martnez Madrid

1
Programacin de Sistemas

Programacin BASADA en Objetos

Julio Villena Romn


<jvillena@it.uc3m.es>

MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES:


M.Carmen Fernndez Panadero, Raquel M. Crespo Garca
Carlos Delgado Kloos, Natividad Martnez Madrid

2
Escenario IV:
Declarar e implementar una clase

Ahora que ya sabes interpretar cdigo e implementar tus


propios mtodos te encargan el diseo de una clase completa
para crear un nuevo tipo de datos con sus caractersticas y
comportamiento.

Objetivo:
Ser capaz de declarar una clase con un conjunto de caractersticas
(atributos) y comportamientos (mtodos)
Ser capaz de crear objetos de una clase dada y modificar o restringir el
acceso a su estado y su comportamiento
Plan de trabajo:
Memorizar la nomenclatura bsica de la programacin orientada a objetos
Practicar el modelado de objetos con ejemplos sencillos para distinguir entre una
clase, un objeto, su estado y su comportamiento
Repasar la sintaxis java para declarar clases, atributos, constructores y mtodos
Recordar el mecanismo y la sintaxis para paso de mensajes entre objetos

3
Objetivos

Definir los conceptos bsicos de la


programacin basada en objetos
Clases, objetos
Miembros (atributos, mtodos)
Abstraccin y ocultacin de informacin
Describir relacin entre objeto y clase
Crear un objeto sencillo y modelar
sus caractersticas (por medio de atributos)
su comportamiento (por medio de mtodos)

4
Clases y objetos
Encapsulacin de objetos
Abstraccin funcional
Abstraccin de datos
Miembros de una clase (atributos y mtodos)
Paso de mensajes
Sobrecarga de mtodos
Constructores
Modificadores y acceso

5
Qu es un objeto?

Los objetos son representaciones (simples/complejas)


(reales/imaginarias) de cosas: reloj, avin, coche
No todo puede ser considerado como un objeto,
algunas cosas son simplemente caractersticas o
atributos de los objetos: color, velocidad, nombre

6
Qu es un objeto?

Abstraccin funcional Abstraccin de datos


Hay cosas que sabemos Un coche tiene adems
que los coches hacen ciertos atributos:
pero no cmo lo hacen: color
avanzar velocidad
parar tamao
girar a la derecha etc.
girar a la izquierda

7
Qu es un objeto?

Es una forma de agrupar un conjunto de


datos (estado) y de funcionalidad
(compor tamiento) en un mismo
bloque de cdigo 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

8
Ejemplo

Clase Objetos

Estado

Constructor

Comportamiento

this referencia al objeto de la clase actual

9
Ejercicio 1

Implementa la clase Bicicleta, que tiene tres atributos,


velocidadActual, platoActual y pionActual, de tipo
entero y cuatro mtodos acelerar(), frenar(),
cambiarPlato(int plato), y cambiarPion(int
pion), 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 pin actual respectivamente segn los parmetros
recibidos. La clase debe tener adems un constructor que inicialice
todos los atributos.

Crea dos objetos de la clase bicicleta: miBicicleta y


tuBicicleta

10
Encapsulacin de objetos

Encapsulacin: describe la vinculacin de un


comportamiento y un estado a un objeto en particular.
Ocultacin de informacin : Permite definir qu partes
del objeto son visibles (el interfaz pblico) que partes son
ocultas (privadas)
La llave de contacto es un interfaz pblico del
mecanismo de arranque de un coche
La implementacin de cmo arranca realmente es
privada y sobre ella slo puede actuar la llave de
contacto

El objeto puede cambiar y su interfaz pblica ser compatible


con el original: esto facilita reutilizacin de cdigo

11
Encapsulacin de objetos

MIEMBROS DE UNA CLASE


Los objetos encapsulan atributos permitiendo acceso a ellos
nicamente a travs de los mtodos
Atributos (Variables): Contenedores de valores
M todos: Contenedores de funciones
Un objeto tiene
Estado: representado por el contenido de sus atributos
Com portam iento: definido por sus mtodos

Normalmente:
Los mtodos son pblicos
Los atributos son privados
Puede haber mtodos privados
Es peligroso tener atributos pblicos
12
Definicin de objetos

Miembros pblicos Miembros privados


los miembros pblicos describen la implementacin de
describen qu pueden cmo lo hacen.
Ejemplo: el objeto contacto
hacer los objetos de esa interacciona con el circuito
clase elctrico del vehculo, este con
el motor, etc.
Qu pueden hacer
En sistemas orientados a
los objetos (mtodos) objetos puros todo el estado
Qu son los objetos es privado y slo se puede
cambiar a travs del interfaz
(su abstraccin) pblico.
Ej: El mtodo pblico frenar
puede cambiar el valor del
atributo privado velocidad.

13
Interacciones entre objetos

El modelado de objetos modela:


Los objetos y
Sus interrelaciones
Para realizar su tarea el objeto puede
delegar trabajos en otro que puede ser
parte de l mismo o de cualquier otro
objeto del sistema.
Los objetos interaccionan entre s
envindose mensajes

14
Paso de Mensajes

Interfaz Pblica
Implementacin
Arrancar

Un objeto enva un mensaje a otro


Esto lo hace mediante una llamada a sus atributos o mtodos
Los mensajes son tratados por la inter faz pblica
del objeto que los recibe
Eso quiere decir que slo podemos hacer llamadas a aquellos atributos
o mtodos de otro objeto que sean pblicos o accesibles desde el
objeto que hace la llamada
El objeto receptor reaccionar
Cambiando su estado: es decir modificando sus atributos
Enviando otros mensajes : es decir llamando a otros atributos o
mtodos del mismo objeto (pblicos o privados) o de otros objetos
(pblicos o accesibles desde ese objeto)

15
Ejemplo

Clase Coche Clase Motor

Clase Rueda
Paso de
mensajes

16
Clasificacin de objetos

Clase: Conjunto de objetos con estados y


comportamientos similares
Podemos referirnos a la clase Coche (cualquier
instancia de la clasificacin coche)
Mi coche es un objeto, es decir una
instancia particular de la clase coche
La clasificacin depende del problema a
resolver

17
Objetos vs. Clases

Una clase es una entidad abstracta


Es un tipo de clasificacin de datos
Define el comportamiento y atributos de un grupo de
estructura y comportamiento similar
Clase Coche Nombre de la clase
Mtodos: arrancar , avanzar , parar, ... Mtodos (funciones)
Atributos: color, velocidad, etc. Atributos (datos)

Un objeto es una instancia de una clase


Un objeto se distingue de otros miembros de la clase por sus
atributos
Nombre: Ferrari
Objeto Ferrari Mtodos: arrancar , avanzar , parar, ...
Perteneciente a la Atributos: color = rojo;
clase coche velocidad 300Km/h

Una clase se declara, un objeto adems se crea

18
Sobrecarga (Overloading)
Qu es?

Podemos definir una clase con dos mtodos


con el mismo nombre si los argumentos son
distintos.
Se utiliza mucho para los constructores.
Sabemos cual de los dos mtodos tenemos
que ejecutar por los parmetros que le
pasamos cuando le llamamos.

19
Sobrecarga (Overloading)
Para qu sirve?

Clase Objetos

Sobrecarga

Son mtodos distintos porque


aunque tengan el mismo nombre
tienen distintos argumentos.
Tienen distinta funcionalidad

20
Ejercicio 2

Sobre la clase Bicicleta, implementa los


mtodo sobrecargados cambiarPlato(), y
cambiarPion(), que no reciben argumentos y
que cambian el plato actual y el pin actual a
un valor por defecto, en concreto, 1.

21
Constructores
Cuando se crea un objeto sus miembros se inicializan con un
mtodo constructor
Los constructores:
llevan el mismo nombre que la clase
No tienen tipo de resultado (ni siquiera void)
Conviene que haya al menos 1 constructor
Pueden existir varios que se distinguirn por los parmetros que
aceptan (sobrecarga)
Si no existen se crea un constructor por defecto sin parmetros
que inicializa las variables a su valor por defecto.
Si la clase tiene algn constructor, el constructor por defecto deja
de existir. En ese caso, si queremos que haya un constructor sin
parmetros tendremos que declararlo explcitamente.

22
Constructores

Array de objetos de la clase Coche

Sobrecarga de constructores

23
Ejercicio 3

Sobre la clase Bicicleta, implementa un


constructor adicional que no recibe parmetros
y que inicializa la velocidad actual a 0, y el
plato actual y el pin actual a 1.

24
Modificadores y acceso
Static (miembros estticos)

Modificador static
Slo existen una vez por clase, independientemente del
nmero de instancias (objetos) de la clase que hayamos
creado y aunque no exista ninguna.
El mtodo o el atributo se comportan siempre de la
misma manera
Se puede acceder a los miembros estticos
utilizando el nombre de la clase.
Un mtodo esttico no puede acceder a miembros no
estticos directamente, tiene que crear primero un objeto

25
Modificadores y acceso
Static (miembros estticos)

Atributo esttico
Otros ejemplos

Atributo esttico
=> -231
=> 231-1

Mtodo esttico: Tiene acceso a atributos estticos


No necesitamos crear instancias

http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html

26
Modificadores y acceso
Static. Algunas reglas

Los miembros estticos se invocan con:


NombreClase.metodoEstatico();
NombreClase.atributoEstatico;
Para acceder a los miembros no estticos necesitamos
disponer de una instancia (objeto) de la clase
NombreClase nombreObjeto = new NombreClase();
Los miembros no estticos se invocan con:
nombreObjeto.metodoNormal();
nombreObjeto.atributoNormal;
Cuando invocacin (llamada) a un miembro esttico 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;

27
Acceso
Mtodos get() 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 mtodos get() y set()

28
Ejercicio 4

Sobre la clase Bicicleta, implementa los


mtodos get() y set()necesarios para poder
acceder y modificar todos los atributos.

29
MODIFICADORES clase metodo atributo
public Accesible desde cualquier otra clase
acceso

(friendly) Accesible slo desde clases de su propio paquete

private Accesibles slo dentro de la clase

Clase de nivel mximo. Es el mismo para todos Es la misma para todos los
static
otros

Se aplica a clases los objetos de la clase. objetos de la clase.


copyright internas Java: Se utiliza: Se utiliza:
mcfp@it.uc3m.es NombreClase.metodo(); NombreClase.atributo;

30
Paquetes

Un paquete agrupa clases (e interfaces)


Las jerarquas de un paquete se corresponden con las
jerarquas de directorios
Para referirse a miembros y clases de un paquete se utiliza la
notacin de separarlos por puntos.
Ej: Cuando importamos paquetes de clases matemticas

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

31
Paquetes

Cmo 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 instruccin
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

32
Programacin de Sistemas

Programacin ORIENTADA a Objetos

Julio Villena Romn


<jvillena@it.uc3m.es>

MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES:


M.Carmen Fernndez Panadero, Raquel M. Crespo Garca
Carlos Delgado Kloos, Natividad Martnez Madrid

33
Escenario V:
Reutilizar cdigo. Herencia

Una vez que eres capaz de crear tus propias clases ests preparado para
trabajar en equipo y reutilizar cdigo de tus compaeros. 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 aadiendo algunas caractersticas
(atributos) y comportamiento (mtodos) a una clase existente.
Ser capaz de extraer todo el cdigo comn de un conjunto de clases similares
para agruparlo en una nueva clase padre para que sea ms fcil de mantener.
Ser capaz de crear objetos, y referenciar y acceder a sus atributos y
mtodos dependiendo de su posicin en la jerarqua 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 bsicos de herencia como ocultacin de atributos, sobreescritura
de mtodos ,saber para qu sirven y cmo se usan

34
Contenidos

Conceptos bsicos de herencia


Jerarqua de herencia
Reescritura I: Ocultacin de atributos
Reescritura II: Redefinicin de mtodos
Constructores de clases derivadas
Polimorfismo
El modificador final

35
Herencia
Qu es?Para qu sirve?

Es un mecanismo para la reutilizacin de software


Permite definir a partir de una clase otras clases
relacionadas que supongan una:
Especializacin (la clase Coche como especializacin de
Vehculo)
Escenario: Tenemos que desarrollar una nueva clase que se parece mucho a una
que tenemos pero necesita informacin (caractersticas y comportamiento) adicional.
Solucin (subclase, clase hija o clase derivada): Creamos una clase derivada
y aadimos nueva funcionalidad sin tener que reescribir el cdigo comn.
Generalizacin (la clase Vehculo como generalizacin de
coche).
Escenario: Tenemos un conjunto numeroso de clases muy similares con cdigo
que se repite y es difcil de actualizar y mantener (ejemplo hay que aadir una letra
al nmero de serie)
Solucin (superclase, clase padre o clase base): Movemos el cdigo que se repite
a un nico sitio

36
Herencia
Para qu sirve?
Recurso Recurso
nombre nombre
descripcion descripcion
decirNombre()
decirNombre()
decirDescripcion()
decirDescripcion()

Aula Ordenador Aula Ordenador


nombre nombre localizacion sistemaOperativo
descripcion descripcion decirLocalizacion() decirSistemaOp()
localizacion sistemaOperativo
decirNombre() decirNombre() public class Aula extends Recur so
decirDescripcion() decirDescripcion()
decirLocalizacion() decirSistemaOp() public class Or denador extends Recur so

Los atributos y mtodos que aparecen en azul en la clase padre se repiten


en las clases hijas [Izquierda]
No es necesario repetir el cdigo, basta con decir que una clase extiende a
la otra o hereda de ella. [Derecha]

37
Herencia
Nomenclatura

Si definimos la clase Coche a partir de la clase


Vehculo se dice que:
"Coche" hereda las variables y mtodos de "Vehiculo"
"Coche" extiende de "Vehiculo"
"Coche" es subclase de "Vehiculo"
clase derivada
clase hija
"Vehiculo" es superclase de "Coche"
clase base
clase padre
La herencia realiza la relacin es-un
Un coche es-un vehculo; un perro es-un mamfero, etc.

38
Herencia
Declaracin 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

39
Herencia
Clase derivada (subclase)

Atributos Mtodos

nombre imprime

apellidos

anyoNacimiento

Heredados de la clase Persona

grupo ponGrupo

horario imprimeGrupo

Clase Alumno

40
Herencia
Cmo se usa? Ej.: Persona.java

protected accesible
desde las subclases

41
Herencia
Cmo se usa? Ej.: Alumno.java

super acceder a
atributos o mtodos de
la superclase

mcfp@it.uc3m.es 2010
42
Herencia
Cmo se usa? Ej.: Prueba.java

Salida por pantalla

43
Herencia
Qu pasa si?

Defino el atributo nombre de Persona como private.


Se hereda, pero no podemos acceder a l, salvo que
implementemos mtodos para ello (p.ej. getNombre())
Implemento el constructor de la subclase asignando
los valores a los atributos directamente en lugar de
llamar a super
No aprovecho la potencia de la reutilizacin de cdigo
En este caso es viable porque los atributos se han definido
como protected (no siempre ser as!!)

44
Herencia
Consecuencias de la extensin de clases

Herencia de la interfaz
La parte pblica de la clase derivada contiene la parte
pblica de la clase base. La clase Alumno contiene el
mtodo imprime()

Herencia de la implementacin
La implementacin de la clase derivada
contiene la de la clase base. Al invocar los
mtodos de la clase base sobre el objeto de la clase
derivada (unAlumno.imprime()) se produce el
comportamiento esperado

45
Ejercicio 5

Partiendo de la clase Bicicleta, la cual tiene tres atributos,


velocidadActual, platoActual y pionActual,
de tipo entero y cuatro mtodos acelerar(), frenar(),
cambiarPlato(int plato), y cambiarPion(int
pion), implementa las clases BicicletaMontaa y
BicicletaTandem.
BicicletaMontaa tiene un atributo suspension de
tipo entero y un mtodo 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

46
Herencia
Jerarqua de herencia en Java

En Java, todas las clases estn


relacionadas en una nica jerarqua de
herencia
Una clase puede:
heredar explcitamente de otra clase
o bien heredar implcitamente de la clase
Object (definida en el ncleo de Java)
Esto se cumple tanto para las clases
predefinidas como para las clases
definidas por el usuario

47
Herencia
Jerarqua de herencia en Java

Object

Boolean Character Number Persona

Integer Long Float Double Alumno Empleado

Bedel Profesor

48
Herencia
Reescritura (o sobrescritura)

Modificacin 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 Ocultacin de atributos
Un mtodo con la misma signatura que uno
de la clase base Redefinicin de mtodos
Lo ms usual cuando se produce reescritura
es que se reescriba un mtodo

49
Reescritura I (Shadowing)
Ocultacin de atributos

Atributos Mtodos

nombre imprime()
Alumno a = new Alumno(...);
apellidos
System.out.println(a.nombre);
anyoNacimiento

Persona p = a;
Heredados de la clase Persona
System.out.println(p.nombre);

nombre ponGrupo(String s)

Mismo nombre pero el grupo imprimeGrupo()

horario
tipo puede ser distinto
Clase Alumno

50
Reescritura I (Shadowing)
Ocultacin 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

51
Reescritura I (Shadowing)
Ocultacin 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 super.

52
Reescritura I (Shadowing)
Ocultacin de atributos

Transporte String nombre = "terrestre"


clase " Abuela "
clase padre Tren Vehiculo String nombre = "turismo"

clase hija Moto Coche String nombre = "Ferrari"

Cmo acceder a variables ocultas (desde la clase hija)?


nombre (nombre del coche) variables
clase hija:
this.nombre (nombre del coche) visibles
super.nombre (nombre del vehculo)
((Vehiculo)this).nombre (nombre del vehculo) Variables
super.super.nombre (Mal) clases padre
ocultas
((Transporte)this).nombre (nombre del transporte)

53
Reescritura II (Overriding)
Redefinicin de mtodos. Qu es?

La reescritura de mtodos es til para


Ampliar la funcionalidad de un mtodo
Particularizar la funcionalidad de un mtodo a la clase derivada
Si definimos en una subclase un mtodo con la misma
signatur a (nombre + tipo y nmero de parmetros) que
en la superclase el de la superclase queda oculto.
Cmo acceder a mtodos ocultos?
Mtodos
arrancar() (ejecuta el mtodo arrancar del coche)
clase hija:
this.arrancar() (ejecuta el mtodo arrancar del coche) visibles
super.arrancar() ( mtodo arrancar del vehculo) mtodos
clases padre:
super.super.nombre (Mal) ocultos

54
Reescritura II (Overriding)
Redefinicin de mtodos Para qu sirve?

Recurso Recurso
nombre nombre
descripcion descripcion
decirNombre() decirNombre()
decirDescripcion() decirDescripcion()

Aula Ordenador Aula Ordenador


nombre nombre descripcion sistemaOperativo
descripcion descripcion localizacion decirSistemaOp()
localizacion sistemaOperativo decirLocalizacion()
decirNombre() decirNombre() decirDescripcion()
decirDescripcion() decirDescripcion()
decirLocalizacion() decirSistemaOp() this.decirDescripcion()

public class Aula extends Recur so super.decirDescripcion()


public class Or denador extends Recur so

55
Reescritura II (Overriding)
Redefinicin de mtodos

error
no
metodo(parametros)?
Object
no


metodo(parametros)?
metodo(parametros)?
Otro
Otro ancestro
ancestro
no


metodo(parametros)?
metodo(parametros)?
Superclase
no
mensaje
metodo(parametros)?
objeto instancia
Subclase
metodo(parametros)

56
Reescritura II (Overriding)
Redefinicin de mtodos

Al mandar un mensaje a un objeto, el


mtodo 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

57
Reescritura II (Overriding)
Redefinicin de mtodos. Ejemplo

class Persona {
public String nombre = "Juan";
public void imprimir() {
System.out.println("Persona: " + nombre);
}
}
class Alumno extends Persona {
public String nombre = "JuanGarca";
public void imprimir() {
System.out.println("Alumno: " + nombre);
}
}
class Test2 {
public static void main (String[] args) {
Alumno a = new Alumno();
Persona p = a;
a.imprimir();
p.imprimir();
} Ambas imprimen:
} Alumno: JuanGarcia

58
Ejercicio 6

Sobreescribe el mtodo acelerar(), de Bicicleta, en las


subclases BicicletaMontaa y BicicletaTandem, de
tal forma que en la primera acelerar suponga triplicar la velocidad
actual y en la segunda cuadruplicar la velocidad actual.
Crea dos objetos de las clases BicicletaMontaa y
BicicletaTandem e invoca sobre ellos el mtodo
acelerar(), cul es el resultado?
Desde estos objetos que has creado, cmo accederas a la
implementacin del mtodo acelerar(), en la clase
Bicicleta?

59
Reescritura vs. sobrecarga

Reescritura: La subclase sustituye la


implementacin de un mtodo de la superclase
Ambos mtodos tienen que tener la misma
signatura
Sobrecarga: Existe ms de un mtodo con el
mismo nombre pero distinta signatura
Los mtodos sobrecargados pueden definirse en
la misma clase o en distintas clases de la
jerarqua de herencia

60
Constructores y herencia

Para la creacin de un objeto:


1. Se crea su parte base
2. Se aade su parte derivada
Si la clase base del objeto hereda a su vez de otra, en el paso 1
se aplica el mismo orden de creacin, hasta llegar a Object
En la creacin de un objeto Alumno que
hereda de Persona, los pasos son:
1. Se crea la parte correspondiente a Persona. Para ello
1. Se crea la parte correspondiente a Object
2. Se aaden los elementos de Persona
2. Se aaden los elementos de Alumno

61
Constructores y herencia

En el constructor de la clase derivada


se realiza siempre una llamada al
constructor de la clase base
sta es la primera accin del
constructor (aparece en la primera lnea)
Hay dos posibilidades:
No indicarlo explcitamente
Indicarlo explcitamente
(obligatoriamente en la primera lnea)

62
Constructores y herencia

1. Si no se indica explcitamente, Java inserta


automticamente una llamada a super() en
la primera lnea 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;
}

63
Constructores y herencia

2. Indicndolo explcitamente

public Alumno (String nombre, String apellidos,


int anyoNacimiento, String grupo,
char horario) {
super(nombre, apellidos, anyNacimiento);
this.grupo = grupo;
this.horario = horario;
}

64
Ms sobre super

super
referencia al objeto actual como si fuera una instancia de su
superclase
A travs de la referencia a super se puede acceder
explcitamente a mtodos de la superclase
Para reescribir mtodos (no slo el constructor), puede ser
til usar la referencia a super

public class Alumno extends Persona {


// el resto permanence igual
public void imprime(){
super.imprime();
System.out.print(" Grupo " + grupo + horario);
}
}

65
Polimorfismo
Capacidad de un objeto de decidir qu mtodo
aplicar, dependiendo de la clase a la que pertenece
Una llamada a un mtodo sobre una referencia de un tipo
genrico (clase base) ejecuta la implementacin
correspondiente del mtodo dependiendo de la clase del
objeto que se cre
Permite disear e implementar sistemas extensibles
Los programas pueden procesar objetos
genricos (descritos por referencias de la
superclase)
El comportamiento concreto depende de las subclases

66
Polimorfismo
Ejemplo
Alumno, Profesor y Bedel.
Creamos un array de Persona donde incluimos objetos de
Alumno, Profesor y Bedel.
Al invocar al mtodo imprimir(), sobrescrito en las clases
Alumno, Profesor y Bedel, sobre el array de Persona, cada
objeto utilizar su propia implementacin del mtodo

Persona[] grupo = {new Alumno(), new


Profesor(), new Bedel(), new Alumno()}

for (int i=0; i<grupo.length; i++){


grupo[i].imprimir();
}

67
Polimorfismo
Ligadura dinmica
Se llama al mtodo correcto, aunque nos
estemos refiriendo al objeto de la subclase a
travs de una referencia a la superclase
Este mecanismo se llama ligadura dinmica
permite detectar en tiempo de ejecucin cul es el
mtodo adecuado para llamar
El compilador no genera el cdigo para llamar
al mtodo en tiempo de compilacin
Genera cdigo para calcular qu mtodo llamar

68
Ejercicio 7

Crea un array de la clase Bicicleta, que contenga objetos


de las clases Bicicleta, BicicletaMontaa y
BicicletaTandem

Invoca el mtodo acelerar() sobre cada uno de los


objetos aprovechando las propiedades de polimorfismo y
ligadura dinmica

69
Modificadores y acceso
Final

Si no se quiere que las clases derivadas


sean capaces de modificar un mtodo o
un atributo de la clase base, se aade a
ese mtodo o atributo la palabra
reservada final

70
Modificadores y acceso
Final

El modificador final se puede aplicar a:


Parmetr o s : Indica que dentro del mtodo no podemos cambiar el valor de
dicho parmetro
public void miMetodo(final int p1, int p2){} //no podemos cambiar valor p1

Atributos: Indica que dentro de la clase no podemos cambiar el valor de dicho


atributo. Se utiliza para definir constantes junto con static
public static final double PI = 3.14; //no podemos cambiar el valor

Mtodos: Indica que las clases que hereden de estas no pueden


sobreescribir dicho mtodo.
public final void myMethod(){} //no podemos sobreescribir myMethod

Clases: Impide la extensin de clases. No se puede heredar de ella


public final class myClass(){} //no podemos extender myClass

71
MODIFICADORES clase metodo atributo
public Accesible desde cualquier otra clase
acceso

(friendly) Accesible slo desde clases de su propio paquete

protected Accesible desde la clase y sus subclases

private Accesibles slo dentro de la clase

No se puede heredar de
final ellas. Es la hoja en el
No se puede ocultar
Es cte y no puede ser
No se puede cambiar su
valor, es cte.
otros

rbol de herencia modificado en las clases Se suele utilizar en


hijas combinacin con static
Clase de nivel mximo. Es el mismo para todos Es la misma para todos los
static Se aplica a classes los objetos de la clase. objetos de la clase.
copyrigh t internas Se utiliza:
Java: Estructura del lenguaje Se utiliza: 49
mcfp@it .uc3m.es NombreClase.metodo(); NombreClase.atributo;

72
Programacin de Sistemas

Programacin ORIENTADA a Objetos (II)

Julio Villena Romn


<jvillena@it.uc3m.es>

MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES:


M.Carmen Fernndez Panadero, Raquel M. Crespo Garca
Carlos Delgado Kloos, Natividad Martnez Madrid

73
Contenidos

Casting. Compatibilidad de tipos


Clases y mtodos abstractos
Interfaces

74
Casting (conversin)
Sintaxis y tipos
Sintaxis:(tipo) identificador
Dos tipos de casting:
Widening o upcasting: Una subclase se utiliza
como instancia de la superclase. Es implcito.
Narrowing o downcasting: La superclase se
utiliza como instancia de una subclase.
Conversin explcita.
Slo se puede hacer casting entre clases
padre e hija no entre clases hermanas

75
Casting (conversin)
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 relacin
es-un)
Persona p = new Alumno();

76
Casting (conversin)
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


Slo 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 tendrn que indicar
explcitamente con un casting (con una
asignacin explcita de la clase).

77
Casting (conversin)
Ejemplo
public class Prueba2 {
public static void main (String[] args) {
Persona p1;
//conversin ascendente implcita - funciona Un alumno
Alumno a1 = new Alumno(); siempre es una
persona
p1 = a1;
(implcito)
Alumno a2;
//conversin descendente implcita No funciona Una persona no
a2 = p1; //error porque no hago conversin explcita siempre es un
alumno
//conversin descendente explcita - funciona
a2 = (Alumno) p1; //p1 referencia una instancia
//de Alumno

Si alguien adems de persona es alumno (no


siempre ocurre) podemos pedirle cosas de alumno
pero tendremos que decirle explicitamente que le
trataremos como alumno.
78
Casting (conversin)
Ejemplo
Persona p2 = new Persona(); Una persona no
Alumno a3; siempre es un
//conversin descendente implcita no funciona alumno. No
podemos asumir
a3 = p2; //da error de compilacin
implicitamente
que lo sea
//conversin descendente explcita no funciona a veces
//lanzar la excepcin ClassCastException
//porque p2 no es de la clase Alumno
Una persona a
a3 = (Alumno) p2; //error veces es un
alumno pero si
no lo es (no lo
hemos creado
//conversin descendente implcita no funciona como tal) no
Alumno a4 = new Persona(); //error podemos tratarlo
} como si lo fuera,
} ni siquiera
aunque se lo
digamos
Una persona no siempre es un alumno. No podemos explicitamente
asumir implicitamente que lo sea

79
Casting (conversin)
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;
}

80
Clases abstractas
Qu son?

Aquellas que tienen al menos un mtodo


abstracto (sin implementar, sin cdigo).
Declara la estructura de una determinada
abstraccin, sin implementar completamente
cada mtodo
Mensaje

Email SMS Fax MensajeVoz

81
Clases abstractas
Caractersticas

Las clases y mtodos abstractos se definen


con la palabra clave abstract
public abstract class Figura {...}

No pueden llevar el modificador abstract:


los constructores
los mtodos estticos
los mtodos privados

82
Clases abstractas
Caractersticas

No podemos crear objetos de una clase abstracta


Pueden existir referencias a clases abstractas
Pero apuntarn 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
Mtodos no abstractos

83
Clases abstractas
Para qu sirven?: Implementaciones parciales

Las clases abstractas suelen usarse para


representar clases con implementaciones parciales
Algunos mtodos no estn implementados pero s
declarados
El objetivo de las implementaciones parciales es dar
una interfaz comn a todas las clases derivadas de
una clase base abstracta
Incluso en los casos en los que la clase base no tiene la
suficiente informacin como para implementar el mtodo

84
Clases abstractas
Mtodos abstractos
Mtodos 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


debern implementar los mtodos abstractos
de la superclase
O sern abstractas ellas tambin
NOTA: No hay llaves!! No estn
implementados: despus de la
declaracin se pone solo un ;
85
Clases abstractas
Cmo 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;
}
}

86
Ejercicio 8

Partiendo de la clase Bicicleta, la cual tiene tres


atributos, velocidadActual, platoActual y
pionActual, de tipo entero y cuatro mtodos
acelerar(), frenar(), cambiarPlato(int
plato), y cambiarPion(int pion), implementa
la clase abstracta Vehculo, la cual ser una superclase de
Bicicleta
Piensa qu atributos y mtodos sern propios de
Bicicleta y cules pueden heredarse de Vehculo,
teniendo en cuenta que adems de Bicicleta existirn
las subclases Coche y Camin
Piensa qu mtodos deben ser abstractos y cules no en la
clase Vehculo
87
Clases abstractas
Polimorfismo
El array es de objetos de
tipo Figura (abstracto)

public static void main(String args[]){


Figura[] misFiguras = new Figura[3];
misFiguras[0] = new Rectangulo(1,3); Los elementos del array son de un
misFiguras[1] = new Triangulo(2,5); tipo concreto (Rectangulo,
misFiguras[2] = new Cuadrado (3); Triangulo, Cuadrado)

for (int i=0; i<misFiguras.length; i++){


System.out.println(misFiguras[i].area());
}

Llamamos a area() sobre objetos de tipo Figura


Y en tiempo de ejecucin mira a ver qu tipo de
objeto contiene, (Ligadura dinmica)

88
Interfaces
Qu son?
Los interfaces son colecciones de mtodos (y constantes)
Todos los mtodos de un interfaz son
abstractos
El acceso a un interfaz es pblico
Los atributos son public, static y final
Los mtodos son public
Los interfaces son implementados por clases
una clase implementa un interfaz definiendo los cuerpos de
todos los mtodos de la interfaz
una clase abstracta implementa un interfaz definiendo los cuerpos de
todos los mtodos de la interfaz o declarando alguno como abstracto
una clase (abstracta o no) puede implementar uno o ms interfaces

89
Interfaces
Qu son?
Una interfaz es un elemento puramente de
diseo
Qu se quiere hacer?

Una clase (incluidas las abstractas) es una


mezcla de diseo e implementacin
Qu se quiere hacer y cmo se hace?

Distintas clases pueden implementar la


interfaz de distintas formas

90
Interfaces
Declaracin
Sintaxis:
public interface nombreInterfaz {
static final tipo CONSTANTE = valor;
tipoDevuelto nombreMetodo(listaParam);
}

NOTA 1: No hay llaves!! No est implementado


despus de la declaracin se pone slo un ;

NOTA 2: Las constantes y mtodos en las


interfaces son siempre pblicos
(no hay necesidad de hacerlo explcito)
91
Interfaces
Implementacin
Si una clase implementa una interfaz, quiere decir que
implementa todos los mtodos abstractos de esa interfaz
Esto se representa con la palabra reservada
implements:

public class Clase implements Interfaz {...}

92
Interfaces
Para qu sirven? Herencia mltiple

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 mltiple
Pero puede implementar varios interfaces
93
Interfaces
Cmo se usan?

Figura Dibujable
area() dibujar()

extends implements

Crculo Rectngulo
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 94
Ejercicio 9

Implementa la interfaz Imprimible, la cual


contiene el mtodo imprime() que no
devuelve ningn valor.

La clase Bicicleta implementa la interfaz


Imprimible de tal forma que se imprima por
pantalla la velocidad actual el pin actual y el
plato actual.

95
Interfaces
Herencia de interfaces y polimorfismo

Las interfaces tambin pueden tener una


jerarqua de herencia

Los mtodos que debern incluir las clases


que implementen las interfaces se van
acumulando siguiendo la jerarqua

Las interfaces tambin dan soporte a la


resolucin dinmica de mtodos durante la
ejecucin (ligadura dinmica)
96
Ejercicio 10

Implementa la interfaz Definir, la cual


contiene el mtodo getAtributos() que
devuelve el valor de los atributos de un objeto.
La interfaz Imprimible hereda de Definir.

Qu cambios hay que hacer en la interfaz


Imprimible? Y en la clase Bicicleta ?

97
Resumen Orientacin a objetos
Clase (concreta)
Todos los mtodos implementados
Clase abstracta
Al menos un mtodo no implementado,
(slo declarado)
modificador abstract
Interfaz
Nada de implementacin
palabra reservada: interface
98
Resumen Orientacin a objetos
Clase (concreta o abstracta)
puede extender (extends) a una sola clase
(herencia simple)
puede implementar (implements) uno o
ms interfaces (herencia mltiple)
Interfaz
puede extender (extends) a uno o ms
interfaces

99
MODIFICADORES clase metodo atributo
public Accesible desde cualquier otra clase
acceso

(friendly) Accesible slo desde clases de su propio paquete

protected Accesible desde la clase y sus subclases

private Accesibles slo dentro de la clase


No se pueden instanciar No tiene cdigo
abstract Son para heredar de Se implementa en las
ellas subclases o clases hijas
Al menos 1 mtodo
abstracto
otros

No se puede heredar de No se puede ocultar No se puede cambiar su


final ellas. Es la hoja en el Es cte y no puede ser valor, es cte.
rbol de herencia modificado en las clases Se suele utilizar en
hijas combinacin con static
Clase de nivel mximo. Es el mismo para todos Es la misma para todos los
static Se aplica a classes los objetos de la clase. objetos de la clase.
copyrigh t internas Se utiliza:
Java: Estructura del lenguaje Se utiliza: 49
mcfp@it .uc3m.es NombreClase.metodo(); NombreClase.atributo; 100