Tema 3: Relaciones entre objetos y clases - Inicio | …POO-2006-2007]Tema3.pdf · Herencia vs....

25
1 { MARCOS L { MARCOS LÓPEZ SANZ } PEZ SANZ } Kybele, 2007 © Tema 3: Relaciones entre objetos y clases Programación Orientada a Objetos Marcos López Sanz Máster en Informática Gráfica, Juegos y Realidad Virtual Kybele, 2007 © { MARCOS L { MARCOS LÓPEZ SANZ } PEZ SANZ } Índice Relaciones entre clases Composición Asociación Uso Herencia Clases y objetos: vistas pública y privada Clases y métodos especiales: finales abstractos y de envoltura Interfaces: declaración, implementación y herencia Otros aspectos Herencia vs. Composición Polimorfismo: Instanciación dinámica/Herencia Clases especiales

Transcript of Tema 3: Relaciones entre objetos y clases - Inicio | …POO-2006-2007]Tema3.pdf · Herencia vs....

1

{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ } Kybele, 2007 ©

Tema 3: Relaciones entre objetos y clases

Programación Orientada a ObjetosMarcos López Sanz

Máster en Informática Gráfica, Juegos y Realidad Virtual

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Índice

� Relaciones entre clases

� Composición

� Asociación

� Uso

� Herencia

� Clases y objetos: vistas pública y privada

� Clases y métodos especiales: finales abstractos y de envoltura

� Interfaces: declaración, implementación y herencia

� Otros aspectos

� Herencia vs. Composición

� Polimorfismo: Instanciación dinámica/Herencia

� Clases especiales

2

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Colaboración entre dos objetos ≡ cuando un objeto lanza mensajes a

otro objeto

� Relación entre dos clases ≡ cuando dos objetos de las respectivas

clases colaboran entre sí

� Tipos de relaciones entre clases:

� Composición

� Asociación

� Uso

Plano de clases(intangible, genérico)

Plano de objetos

(tangible, particular)objeto a objeto b

men

saje

Clase A Clase B

objeto a objeto b

men

saje

Clase A Clase B

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Relación de composición� Se constituye entre el todo y la parte

� Objeto de la clase A “tiene un/contiene un/posee un” objeto de la clase B

� Cuestiones físicas (libro/páginas) y relaciones lógicas (propietario/casas)

� Existe una delegación de ciertas responsabilidades del todo a la parte: almacenamiento de datos o funcionalidades � Suelen ser atributos de una clase

� La responsabilidad de manejar el objeto “interno” es exclusiva del objeto contenedor

3

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Relación de composición: Ejemplopublic class Radio

{private final Antena antena = new Antena();

private Dial dial[] = new Dial[2];

private Display display;

public Radio(){

Dial.setOrigenOndas(this.antena);

this.dial[0]=new Dial(“FM”);

this.dial[1]=new Dial(“AM”);

}

}

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Relación de uso� Se establece momentáneamente entre dos objetos (un cliente y un

servidor)

� El objeto cliente utiliza funcionalidades (métodos/mensajes) del objeto servidor para completar su cometido sin dependencias futuras � suelen ser variables de métodos:

• Visibilidad pública � Parámetros

• Visibilidad privada � Variables Locales

� Delegación temporal de responsabilidades del cliente al servidor

� La responsabilidad de manejar el objeto servidor no depende únicamente del objeto cliente

4

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Relación de uso: Ejemplo

public class Radio

{ …

public void moverDial (Cadena cadena)

{

this.Dial.setFrecuencia(cadena.getFrecuencia());

}

public Cadena getCadenaActual()

{

Cadena cad = new Cadena (this.Dial.getFrecuencia());

return cad;

}

}

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Relación de asociación

� Relación que perdura entre un cliente y un servidor determinado

� Creación de una relación bidireccional entre dos objetos � al cliente se le pasa una referencia (en un constructor por ejemplo) de un objeto que tiene existencia externa

� Delegación de responsabilidades del cliente al servidor

� La responsabilidad de manejar el objeto servidor no depende únicamente del objeto cliente

5

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Relación de asociación: Ejemplopublic class Radio

{ …public Radio (Visor display)

{

this.display = display;

}

public void mostrarFrecuencia()

{

this.display.visualizar(this.Dial.getFrecuencia());

}

}

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Características de las relaciones� Visibilidad: carácter privado o público de la colaboración entre

objetos

� Temporalidad: mayor o menor duración de la colaboración

� Versatilidad: intercambiabilidad (modificación) de los objetos en la colaboración con otro objeto

Privado Público

VersátilNo

VersátilNo

Versátil

ComposiciComposicióónn

Momentáneo

NoMomentáneo

UsoUso

AsociaciAsociacióónn

6

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Factor determinante � contextocontexto

� Ejemplos:� Radio/Display

• Asociación: radio-despertador

• Composición: radio de coche

� Paciente/Médico

• Uso: urgencias de un hospital

• Asociación: médico de cabecera

� Motor/Coche

• Asociación: taller mecánico

• Composición: parque automovilístico

No existe la relación ideal categórica para toda colaboración entre objetos

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases

� Otros aspectos de las relaciones:

� Objetivo de establecer relaciones: reconocer, estudiar, analizar, etc. la forma en que colaboran los objetos

� Establecimiento de relaciones � preservando el principio de encapsulación �decisión de ingeniería

� No existen fórmulas para traducir la relación escogida a un código particular:

• Composición: el objeto “parte” nace con el objeto “todo”

• Asociación: objeto “cliente” tiene un atributo referencia a otro externo (existente)

• Uso: objeto que sólo tiene sentido en la ejecución de un método

7

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Relaciones entre clases: Ejercicio

Jugador TableroTurno

TresEnRaya

Coordenada

� Tomar una clase

� Determinar el comportamiento

� Determinar los atributos con sus

respectivas relaciones

� Codificar los métodos

� “Recapitular”

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Herencia

� Concepto de herencia:� Def.: Forma de estructurar tipos/clases según su comportamiento

mediante la creación de una jerarquía de clasificación

Clase padre/madre/base

Superclase

Clase hija/extendida/derivada Subclase

GeneralizaciGeneralizacióónn

EspecializaciEspecializacióónn

8

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Herencia

� Propiedades

� Un objeto de una subclase puede acceder a campos y métodos declarados en su superclase � hereda sus atributos y operaciones

� Una subclase “extiende” las propiedades de su superclase

� Una subclase es una forma restringida de la superclase

� Intuitivamente fácil de comprender

� En Java: todo objeto hereda de Object:

Object

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Herencia

� Propósitos� Especificación: Si la superclase es un interfaz o una clase abstracta

� Especialización: La superclase proporciona funciones a las subclases, pero éstas pueden redefinir los métodos adecuándolos a su comportamiento específico

� Extensión: La subclase añade nueva funcionalidad (métodos y campos) pero no modifica ni altera lo heredado � Subtipo

� Combinación múltiple: Se hereda de varias clases.

• Denominada herencia múltiple

• No permitida en Java

9

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Herencia

� Beneficios

� Reusabilidad del Software: se reutiliza el código heredado

� Mayor fiabilidad: al reusarse el código existente, hay más posibilidad de encontrar errores y subsanarlos

� Consistencia de interfaces: la jerarquía de herencia asegura que objetos similares tienen vistas públicas similares

� Prototipado rápido: al reutilizarse código se favorece este método de desarrollo

� Ocultación de información: la disponibilidad de interfaces claras reduce las interconexiones entre sistemas (clases padre como interfaz)

Todo el código que se haya escrito para objetos de la clase padre también funcionará con objetos de la clase hija

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Herencia

� Inconvenientes

� Velocidad de ejecución: la ligadura dinámica es más lenta que la estática

� Tamaño del programa: el hecho de usar librerías conduce a programas

más grandes que hechos a medida

� Complejidad del programa: comprender el flujo de ejecución de un POO

es más difícil puesto que hay que ascender y descender por la jerarquía de

objetos � problema del “yoyó”

10

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Herencia:

Clases.Vista_Publica

� Sintaxis:public class <idSubclase>

extends <idSuperclase>

{…}

� Subclase = campos y métodos propios + campos y métodos de la superclase

� Definición de métodos y atributos propios:� Métodos existentes (igual nombre):

• Distinta definición � Sobrecarga

• Igual definición � Redefinición: sustituye al de la superclase

� Visibilidad (modificadores): distintos (pero sólo para hacerlos más restrictivos)

� Los métodos estáticos no pueden redefinirse

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Formas básicas de usar la herencia (no excluyentes)

� Especialización: relación “es-un” (IS-A). Redefinición de comportamiento: tipos

• Reemplazamiento (total):

• Refinamiento (código añadido)

� Extensión: se usa la herencia para aumentar la funcionalidad de la clase padre

Herencia: Clases.Vista_Publica

11

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Principio de sustitución (proviene del concepto de subtipado):

� A una variable declarada de una clase puede asignársele un objeto creado de una subclase

� Una referencia puede acceder a un objeto de la clase indicada en su declaración o a una subclase de ésta

� A una variable de tipo object se le puede asignar cualquier objeto

� Compatibilidad de asignación: aplicación del principio de sustitución al paso de parámetros y a la devolución de resultados

� Constructores y métodos: cualquiera de los de su clase y las clases padre

Herencia:

Objetos.Vista_Publica

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Comprobación de la clase de un objeto (devuelve un booleano)

<referencia> instanceOf <idClase>

� Proyección: Una variable de la clase A puede contener referencias a objetos

de la clase B

A a;

a = new B();

� Se dice que:

� A es el tipo estático de la variable a

� B es el tipo dinámico de a.

� El tipo estático siempre se determina en tiempo de compilación mientras que

el tipo dinámico en general sólo se puede conocer en tiempo de ejecución y

puede cambiar.

Herencia:

Objetos.Vista_Publica

12

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Una clase extendida puede acceder a los campos y métodos de sus superclases

� Constructores:� No se heredan � deben declararse explícitamente

� La construcción del estado puede delegarse a las clases hijas

� Invocación explícita a un constructor de la superclase:super(<parámetros>)

� Métodos: Acceso mediante super.<método>(<parámetros>);

� Atributos:� No se redefinen � en caso de igual nombre se sobreescribe el de la superclase

� Accesos a campos de superclases (sobreescritos u ocultos) con super.<atributo>

Herencia:

Clases.Vista_Privada

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Los constructores (en java) no se heredan

class A{

A(int ix, int iy){ ... };

}

class B extends A{

...

}

B b= new B(1,2); // error, ningún constructor casa

Herencia:

Clases.Vista_Privada

13

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� El constructor de la clase base se puede invocar con superclass B extends A

{

...

B(int ix, int iy)

{

super(ix, iy);

z= 0;

}

B(int ix, int iy, int iz)

{

super(ix, iy);

z= iz;

}

B(B b)

{

z= b.z; // x=y=?

super(b.x, b.y); // error, super debe ser la primera instrucción

}

}

Herencia:

Clases.Vista_Privada

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Creación de un objeto: reserva de memoria para todos sus campos incluidos los que se heredan de sus superclases

� Pasos:� Invocación del constructor de la superclase (implícita o

explícitamente)

� Inicialización de los campos: Se admiten referencias a campos del objeto en su orden de declaración actual

� Se ejecuta el cuerpo del constructor que lo invocó para que acabe de ejecutar el resto de su cuerpo.

� El proceso continúa hasta que se haya ejecutado el cuerpo del constructor invocado por el operador new

Herencia:

Objetos.Vista_Privada

14

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Enlace dinámico (o ligadura dinámica)

class A{ ...

void print(){ System.out.println(x+" "+y); }

}

-------------------------------------------------

B b= new B(1, 2, 3);

b.print(); // 1 2

Herencia:

Objetos.Vista_Privada

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Enlace dinámico (o ligadura dinámica)

class B extends A

{ ...

void print() // Redefinición

{ System.out.println(x+" "+y+" "+z); }

}

-------------------------------------------------

B b= new B(1, 2, 3);

b.print(); // 1 2 3

A a= new A(1, 2);

a.print(); // 1 2

Herencia:

Objetos.Vista_Privada

15

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

� Enlace dinámico (o ligadura dinámica)

A a= new B(1, 2, 3);

a.print(); // ?

Solución: se invoca el método definido para el tipo dinámico de la variable (el de la clase más específica a la cual pertenece el objeto referenciado por la variable)

� Enlace dinámico: forma de enlazar el nombre de un método con el código que se ejecutará para un objeto determinado

� El método que finalmente se invocará (en general) sólo se conoce durante la ejecución y no durante la compilación

Herencia:

Objetos.Vista_Privada

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Polimorfismo

� Def.: posibilidad que tienen distintos objetos de actuar de una manera diferente

(desencadenar operaciones distintas) en respuesta a un mismo mensaje (una misma llamada a función)

Oso

tumbarse()

Pantera

subirArbol()

León

acostarse()

void dormir()

{ }

void dormir()

{ // en un árbol }

void dormir()

{ // sobre el vientre}

void dormir()

{ // sobre la espalda}

Cuidador

acostar(fiera : Animal)

prepararJaula(fiera : Animal)

Animal

numeroJaula

dorm ir()

getNum eroJaula()

Christopher Strachey. Fundamental concepts in programming languages. Lec-

ture Notes, International Summer School in Programming Languages, Copen-

hagen, August 1967.

16

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Polimorfismo

public class CuidadorCuidador{

public CuidadorCuidador (){};

private void prepararJaula(Animal fiera){

int jaula = fiera.getNumeroJaula();

this.limpiarJaula(jaula);

}

public void acostar(Animal fiera){

this.prepararJaula(Animal fiera);

fiera.dormir();

}

}

public class AnimalAnimal {

private int numeroJaula;

public AnimalAnimal (int jaula){

this.numeroJaula = jaula;

}

public void dormir () {}

public int getNumeroJaula(){

return this.numeroJaula;

}

}

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Polimorfismo

public class PanteraPantera extends Animal {

public PanteraPantera (int jaula){ super(jaula); }

public void dormir (){

this.subirArbol();

}

}

public class OsoOso extends Animal {

public OsoOso (int jaula){super(jaula); }

public void dormir (){

this.tumbarse(this.roca);

}

}

public class LeonLeon extends Animal {

public LeonLeon (int jaula){ super(jaula); }

public void dormir (){

this.acostarse();

}

}

17

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Polimorfismo

public class ZooZoo{public static void main(){

Animal[] animales = new Animal[54];

// creamos un array con los animales de un Zoofor(int i = 0; i < 18; i++) {

animales [3 * i + 0] = new Pantera(3 * i + 0);

animales [3 * i + 1] = new Oso(3 * i + 1);

animales [3 * i + 2] = new Tigre(3 * i + 2);

}

// recorremos el array de animales haciendo que el cuidador los mande a dormirCuidador cuidador = new Cuidador();

foreach(Animal fiera in animales) {

cuidador.acostar(fiera);

}

}

}

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Polimorfismo

� Tipos de polimorfismo� “Ad hoc” o estático: (overloading = utilizar la misma sintaxis para objetos de diferente tipo)

• Sobrecarga

• Coerción: conversión de objetos de una clase a otra (cast)

� Dinámico, universal o “polimorfismo de subtipado”: (overriding)

• Permite a una función utilizar un objeto que se le ha pasado de un tipo T pero que también funcionaría si se le pasa un subtipo de T (principio de sustitución de Liskov)�Subtyping

� Paramétrico: permite a una función tratar argumentos de diferente tipo

� Bases:� Herencia: no se puede aplicar polimorfismo dinámico si no es con clases que hereden de otras

(subclassing)

� Instanciación dinámica: una referencia a un objeto A puede estar haciendo referencia a distintos objetos derivados de la clase A � el polimorfismo siempre implica enlace dinámico

� Beneficios:� Abstracción: no es necesario conocer toda la jerarquía de clases derivadas

� Extensibilidad: aumentar la funcionalidad del programa/sistema sin tener que modificar el código ya escrito

http://forum.java.sun.com/thread.jspa?threadID=713494&tstart=105

18

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales

� Interfaces

� Clases abstractas

� Clases finales� Clases internas

� Clases e interfaces internas static

� Clases internas miembro (no static)

� Clases internas locales

� Clases anónimas

� Clase Object

� Clases de envoltura

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Interfaces

� Def.: Conjunto de declaraciones de métodos (sólo definición de cabeceras, sin implementación).

� Sintaxis de creación de un interface :

public interface <idInterfaz>{ … }

� Reglas similares a la creación de clases: empiezan por mayúscula, el fichero en el que se guardan se llama igual que el interfaz, etc.

� Atributos: � sólo constantes � siempre public, static y final

� deben inicializarse

� Métodos: siempre public y abstract

19

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Interfaces

� Definición de clases que implementan interfaces:public class <idClase> [ extends <idSuperClase> ]

implements <idInterfaz1>[,<idInterfaz2>,…]

{ … }

� Toda clase que implemente un interface debe proporcionar una definición a sus métodos � le da un modo de funcionamiento (una conducta)

� Una clase puede implementar más de un interface (es la forma de tratar la herencia múltiple)

� Herencia:� Se permite herencia simple y múltiple entre interfaces

� Se puede utilizar también con extends

� Polimorfismo: se puede utilizar un interface como tipo de una referencia aunque su uso estará restringido a los métodos del interface .

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Abstractas

� Tipos de clases� Abstractas: no se pueden crearse objetos concretos

� Concretas: sí se puede

� Declaración de clase abstractapublic abstract class <idClase> {…}

� Se permite extends pero no final

� Declaración de métodos abstractospublic abstract <idtipo><idMetodo>(<param.>);

� No se permite static ni final

� Cualquier clase que tenga un método abstract tiene que ser declarada como abstracta

20

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Abstractas

� Usos� Especificar datos o métodos comunes a un conjunto de (sub-)clases

pero sin suficiente entidad para crear objetos

� Forzar que las subclases tengan un comportamiento propio(métodos abstractos)

� Compatibilidad de asignación (herencia)

� Implementación no válida para parte de la jerarquía, etc…

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales:

Abstracta vs. Interface

1. Una clase no puede heredar de 2 clases abstract pero si de una abstract e implementar uno o más interface

2. Una clase no hereda métodos implementados de un interface pero sí constantes

3. Los interface permiten publicar comportamiento de una clase desvelando un mínimo de información

4. Los interface tienen una jerarquía propia, más flexible que las clases � permite herencia múltiple

5. Polimorfismo: las referencias de tipo interfaz se comportan igual que las de tipo clase abstracta

21

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Finales

� El modificador final restringe la flexibilidad del sistema OO

� Clase final� No puede tener ninguna subclase

� Todos sus métodos son finales

� Método final� No puede ser redefinido en una subclase

� Atributo final� Se utiliza como una constante: no se puede modificar su valor (una vez

asignado)

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Internas

� Def.: es una clase definida dentro de otra, llamada clase contenedoraclass ClaseContenedora{

class ClaseInterna{

}

}

� Tipos� Static

� Miembro (no static)

� Locales

� Anónimas

22

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Internas

� Static (o anidadas)

static class ClaseInterna{

}

� Utilización:

ClaseContenedora.ClaseInterna

� Pueden definirse clases o interfaces internas static dentro de clases o interfaces contenedoras

� Se permiten varios niveles de anidamiento

� Modificadores: final, public, private y protected

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Internas

�Clases internas miembro (no static) o simplemente internas� Definidas al máximo nivel de la clase contenedora

� No pueden tener variables miembro static

� Especial: cada objeto de la clase interna existe dentro de un y sólo un objeto de la clase contenedora

23

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Internas

� Miembro (no static):� Acceso a los atributos desde los métodos

• Los métodos de la clase interna ven directamente las variables del objeto contenedor

• Los métodos de la clase contenedora necesitan referenciarlos con un objeto de la clase interna (cualificar)

� Permisos de acceso

• Clases internas: private y protected (las “normales” sólo pueden ser public y package)

• Clase interna: acceso a todos los atributos de la clase contenedora

• Clase contenedora: acceso a los atributos de la clase interna a través de referencia

� Otras características

• this = atributos de la clase interna

• ClaseContenedora.this = atributos de la clase contenedora

• Creación de un objeto de la clase interna a partir de uno de la clase contenedora (obligatorio):

ClaseContenedora.ClaseInterna b = objClaseContenedora.new ClaseInterna()

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Internas

� Locales� Definidas dentro de un bloque de código, normalmente un método (o un

inicializador static)

� Acceso a todas los atributos de la clase contenedora

� Acceso a las variables del bloque de código

� No pueden:

• Tener el mismo nombre que la clase contenedora

• Definir variables, métodos o clases static

• Definir modificadores de visibilidad � siempre dependientes del bloque en el que se declaran

24

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: Internas

� Anónimas

� Como las clases locales pero sin nombre

� En las locales primero se define la clase y luego se crean los objetos de esa clase.

� En las clases anónimas estos pasos se hacen a la vez al no tener nombre (tampoco tienen constructores)

� Formas de creación:

• new { // declaración de la clase }

• new NombreClase/InterfazDelQueHereda () { // declaración de la clase} ;

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: “Object”

� Es la raíz de toda la jerarquía de Java

� Por defecto cualquier clase es subclase de Object, es decir:� public class c {…} = public class c extends Object {…}

� Métodos que pueden ser redefinidos por el programador:� Object clone (): devuelve una copia del objeto

� boolean equals (Object obj): indica si 2 referencias son el mismo objeto

� String toString(): devuelve una representación del objeto

� finalize(): destruir el objeto

� Métodos que no pueden ser redefinidos (finales)� Class getClass(): devuelve un objeto de la clase Class al que se le puede

preguntar por el nombre de la clase

� notify(), notifyAll() y wait(): métodos relacionados con los threads

25

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Clases especiales: de envoltura

� Se refieren a todas las clases definidas en Java para representar tipos primitivos

� Funciones principales:� Proporcionar métodos de utilidad al tipo primitivo (valueOf, MIN_VALUE,

etc.)

� Crear objetos que almacenen tipos primitivos

� Constructores (creación de un objeto de la clase de envoltura)� A partir de un tipo primitivo

� A partir de una cadena de caracteres

Byte Short Integer Long Float Double

Object

Boolean Character Number Void

Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }

Agradecimientos

Algunos contenidos y gráficas recogidas en estas transparencias han sido extraídos del libro:

Programación II: Teoría y práctica del módulo de programación orientada a objetos

ISBN: 84-87238-39-4

Es por ello que queremos agradecer a Luís Fernández Muñoz la posibilidad de reproducir parte de su contenido