Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

52
Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos

Transcript of Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

Page 1: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

Ignacio Zahonero MartínezLuis Joyanes Aguilar

CursoProgramación en Java

Tema 5Clases y Objetos

Page 2: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

2Ignacio Zahonero MartínezLuis Joyanes Aguilar

CLASES(I)

Una clase es la descripción de las características de un conjunto de objetos. Una clase consta de métodos y datos que resumen características comunes del

conjunto de objetos. Las clases son similares a los tipos de datos, equivalen a un tipo de datos objeto. Una clase no tiene existencia real. Una instancia de una clase si tiene existencia real. Cada vez que se construye un objeto a partir de una clase se está creando una

instancia de esa clase.

Un objeto se construye a partir de una clase, haciendo una instanciación. En general, instancia de una clase y objeto son términos intercambiables.

class Socio Socio melito = new Socio("Juan Bao");

{ private String nombre; public void darAlta();

class Lampara Lampara c1 = new Lampara(); { Lampara c2 = new Lampara(); private int potencia; private boolean solar; public void darMasPot(int p)

Page 3: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

3Ignacio Zahonero MartínezLuis Joyanes Aguilar

CLASES(II)

Generalmente, una clase se define como una descripción abstracta de un grupo de objetos, cada uno de los cuales se diferencia por un estado específico y es capaz de realizar algunas operaciones.

Por ejemplo, la lámpara de mi mesa es un objeto que tiene un estado (encendida o apagada) que puede realizar operaciones, por ejemplo iluminar, apagar, cambiar bombilla si está rota.

En programación, una clase es una estructura que contiene datos y procedimientos (funciones, métodos) que son capaces de operar sobre esos datos.

La clase Lámpara tiene una variable que representa la potencia, otra variable para la intensidad, otra para si puede funcionar con energía solar. La clase tiene métodos (funciones) que operan o utilizan esas variables.

Dentro de un programa, las clases tienen dos propósitos principales: definir abstracciones y favorecer la modularidad.

Por ejemplo, la clase Radio encapsula las características y comportamiento de ciertas entidades del mundo real. El concepto abstracto de "Radio" no tiene existencia física, mientras que mi radio Thomson es un objeto, una instancia, de la clase Radio sí tiene existencia física y dispone de las características de toda Radio, por ejemplo sintoniza una emisora, se estropea, se queda sin pilas .... .

Page 4: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

4Ignacio Zahonero MartínezLuis Joyanes Aguilar

CARACTERÍSTICAS DE UNA CLASE

Abstracción: extrae lo común de un conjunto de objetos

Encapsulamiento de la información: la clase permite asegurar que el contenido de la información de un objeto está oculta del mundo exterior.

Definición rigurosa de la interfaz con el mundo exterior. El interfaz de una clase captura sólo su vista externa. Además, la clase tiene una parte de implementación que contiene la representación de la abstracción, así como los mecanismos que realizan el comportamiento deseado.

Tolerancia a los cambios de implementación.

Flexibilidad y adaptabilidad.

Page 5: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

5Ignacio Zahonero MartínezLuis Joyanes Aguilar

DECLARACIÓN DE CLASES

La declaración (en Java) tiene el formato siguiente:

class Nombre{

private ... protected ... public ... //cuerpo de la clase

} El cuerpo contiene las declaraciones de los miembros:

Miembros dato, se declaran como variables.Miembros método, se declaran y definen (implementan) en el cuerpo de la clase . En C++ normalmente, su implementación se sitúa en el exterior.

[modificador] class NombreClase // formato general

class NumerosRojos

{

private String numCuenta ="2345-g";

private Titular t;

private float saldo = 0.0;

public void enviarAviso() {

System.out.print(" ");}

}

Page 6: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

6Ignacio Zahonero MartínezLuis Joyanes Aguilar

MODIFICADORES DE CLASE

public. Una clase public es accesible por todo el mundo, es decir, cualquiera puede declarar referencias a la clase o acceder a sus miembros públicos. Sin ese modificador, la clase sólo podría ser accesible por los miembros de su propio paquete. Sólo puede haber una clase por archivo; además, el nombre del archivo debe coincidir con el de la clase.

abstract. No se pueden crear instancias de dicha clases. Una clase abstract puede contener métodos abstractos, métodos normales y atributos constantes. Normalmente está diseñada para ser una superclase.

final. Una clase final no admite subclases .

synchronizable. Indica que todos los métodos de la clase son sincronizables, es decir, que no se puede acceder a ellos al mismo tiempo desde distintos hilos (threads).

Page 7: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

7Ignacio Zahonero MartínezLuis Joyanes Aguilar

ENCAPSULAMIENTO EN LAS CLASES(II)

La visibilidad de cada miembro de la clase depende del especificador de acceso que le afecta: private, protrected y public.

class Nombre_Clase{ private miembro privado protected miembro protegido public miembro publico

}

Miembros privados: sólo accesibles por métodos miembro de la clase. Etiqueta private.

Miembros públicos: accesibles desde cualquier parte del programa. Forman el interfaz a través del cual se utiliza el objeto. Etiqueta public.

Miembros protegidos: accesibles por los métodos miembro de la clase y de las clases derivadas. Etiqueta protected.

Por defecto, en Java, son accesibles desde la propia clase y por las clases del mismo package.

class Autor

{

private String nom = "Sin nombre";

private int codigo;

private Vector<Obra> v = new Vector<Obra>();

public void setNombre(String n) ...

}

Page 8: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

8Ignacio Zahonero MartínezLuis Joyanes Aguilar

ENCAPSULAMIENTO EN LAS CLASES(III)

El uso del interfaz público ha de estar limitado a los métodos miembro requeridos para manipular y proveer información sobre las instancias creadas de la clase.

Los métodos miembro de apoyo a los otros métodos de la clase deben estar ocultos.

Los datos estarán ocultos al exterior de la clase. En general se incluyen en la sección privada o protegida.

La cláusula protected reduce el nivel de ocultación, permitiendo que las clases derivadas accedan a los miembros protegidos de la clase base.

Utilizar métodos miembro para establecer y consultar los valores de los datos (métodos set y get).

Para permitir el acceso a las clases descendientes, situar los datos en la sección protegida (protected).

class Planta

{

protected int a, b;

public int getAncho() {

return a; }

Planta una = new Planta(20,14);

una.b = 12; // error

una.setBase(12); // correcto

Page 9: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

9Ignacio Zahonero MartínezLuis Joyanes Aguilar

EJEMPLOS DE DECLARACIÓN DE CLASES

class Ventana

{

public void inicio(){...}

public void mover(int, int) {...}

public char get() {...}

public char get(int x, int y) {...}

private void checkeoRango

(int a, int b) {...}

protected short alto, ancho;

protected Punto posicion;

protected Punto inicioPantalla;

}

class Rectangulo

{

protected double base;

protected double altura;

public void

dimension(double a, double h)

{

base = a; altura = h;

}

public double area()

{

return base * altura;

}

}

Page 10: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

10Ignacio Zahonero MartínezLuis Joyanes Aguilar

DATOS MIEMBRO DE LA CLASE

La declaración de los datos miembro (atributos) de una clase es de la misma forma que la declaración de variables.

En Java está permitida la inicialización explícita de las variables que representan a los datos.

El constructor de la clase tiene como misión inicializar los datos miembro.

Un dato puede ser un objeto de otra clase (objetos compuestos).

class Fecha { ... };

class Dni { ... };

class Persona

{

protected String nombre;

protected Fecha diaNac;

protected Dni idt;

protected char genero ='I';

Page 11: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

11Ignacio Zahonero MartínezLuis Joyanes Aguilar

MIEMBROS (ATRIBUTOS) DE CLASE

En ocasiones se puede desear tener una sóla instancia de un campo compartido por todos los objetos de una clase. Esos campos se declaran como static y se denominan atributos estáticos o atributos de clase. Cuando se declara un campo estático en una clase sólo existe una copia de éste que mantiene su valor en todas las instancias de la clase.

El atributo estático puede utilizarse dentro de la clase simplemente haciendo referencia a él. Si el modificador de acceso lo permite, también es posible utilizarlo desde fuera de la clase. Normalmente esto se hace indicando la clase a la que pertenece. Por ejemplo:

Math.PI; Racional.cuentaRacional; public class Pantalla { public static final String sistema = new String("LCD"); ...} Pantalla.sistema;

Page 12: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

12Ignacio Zahonero MartínezLuis Joyanes Aguilar

INICIALIZADORES DE MIEMBROS STATIC DE CLASE

Dentro de una clase se puede definir un bloque con la finalidad de establecer un valor inicial a los miembros static.

Sintaxis: static { sentencias de inicialización}

Ejemplo: public class ClaseEjemplo { static Circulo c;

static double r;

static String que = "LCD";

...

static { c = new Circulo(12, Color.red);

r = 10.0;

}

Las variables de tipo primitivo se pueden inicializar directamente.

Los bloques static de una clase se ejecutan automáticamente al utilizar por primera vez la clase.

Page 13: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

13Ignacio Zahonero MartínezLuis Joyanes Aguilar

ATRIBUTOS CONSTANTES

Un atributo que tenga el modificador final no puede cambiarse una vez ha sido inicializado. Se utilizan para definir propiedades que no cambian durante la vida de una clase o de un objeto.

Normalmente los atributos constantes son static ya que no pertenecen a los objetos.

public class Matematicas { public static final double E = Math.exp(1.0);

Cuando se utiliza el modificador final con variables referencia a objetos, se convierte en una referencia constante, es decir una vez que se inicializa, el atributo no puede referenciar a otro objeto, aunque se puede cambiar el valor del objeto en sí (esto incluye a los arrays, que también son objetos).

final Circulo c1 = new Circulo(10.0); c1.color = Color.blue; // correcto si la visibilidad lo permite c1 = new Circulo(7.0); // error fina int v[] = new int[20]; v[0] = 0.0; // correcto

Page 14: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

14Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS DE UNA CLASE(I)

Son las funciones declaradas y definidas dentro del cuerpo de la clase. Conceptualmente, los métodos de una clase son el conjunto de operaciones que

pueden "manipular" objetos de la clase en las que han sido declaradas. Los métodos de una clase pueden acceder directamente a cualquier miembro dato o

a otro método, público o no público, de su clase. Un método sólo se puede sobrecargar a otro método miembro de su propia clase. Los métodos utilizados para manipulación interna de datos deben ser privados o

protegidos. Los métodos que describen el comportamiento, los definidos para entrada, o, en

general, de proceso serán públicos.

class Racional {

public Racional suma (Racional r2) {...}

public Racional suma (int n) {...}

private void simplifica() // método interno

La sintaxis estándar para la llamada a un método de una clase (enviar un mensaje): nombre_objeto.nombre_método(parámetros)

Page 15: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

15Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS DE UNA CLASE(II)

Los métodos proporcionan la funcionalidad a las clases y contienen el código que maneja el estado de un objeto. Aunque es posible utilizar directamente los atributos public o protected de un objeto, esto no es lo recomendable y es mejor dejar esa tarea a los métodos de la clase.

Sintaxis: [modificadoresdeAcceso] [static] [abstract] [final] [synchronized]

tipoRetorno nombreMétodo([listadeArgumentosFormales]) [throws listadeExcepciones]

{

// cuerpo del método

}

Los métodos pueden acceder directamente a los atributos del objeto, ya que implícitamente tienen definida la autoreferencia this (objeto que envía el mensaje).

Page 16: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

16Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS DE UNA CLASE(III)

El tipo de retorno puede ser:

• Tipo primitivo (boolean, char, byte, short, int, long, float y double) • Arrays y vectores. • Objeto • Interface.

Paso de argumentos

Todos los argumentos en Java se pasan por valor. Cuando se pasa un tipo de dato primitivo se pasa el valor del dato, pero cuando se pasa un objeto se pasa el valor de la referencia, no el objeto en sí. Esto significa que el objeto puede modificar sus atributos aunque el argumento haga siempre referencia al mismo objeto.

Page 17: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

17Ignacio Zahonero MartínezLuis Joyanes Aguilar

SOBRECARGA DE MÉTODOS

La sobrecarga de métodos permite asignar el mismo nombre a métodos con funcionalidades distintas y con distinto número o tipo de argumentos.

class Empleado{ final float PRECIO_HORA = 30; public void aumentarSueldo(float porCiento){ this.sueldo = (this.sueldo * porCiento / 100) + this.sueldo }; … public void aumentarSueldo(int horas){ this.sueldo = this.sueldo + (horas * PRECIO_HORA);} Llamadas, siendo e = new Empleado(); //Aumenta el sueldo un 10 por ciento e.aumentarSueldo(10.0f); //Aumenta el sueldo según las horas extras e.aumentarSueldo(2);

El compilador Java distingue entre distintos métodos sobrecargados según la lista de argumentos.

Page 18: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

18Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS DE CLASE (MÉTODOS STATIC)

Un método que se desee invocar independientemente de cuantos objetos se hayan creado, incluso si no se ha creado ninguno, se declara con la palabra reservada static.

public class Teatro{ private long ID = 0; private String nombre = "SinNombre"; private static long sigID = 0; public Empleado(){ID = sigID++;} public static long cuantosTeatros(){return sigID;} }

// Llamada al método estático System.out.println("Se han creado " + Teatro.cuantosTeatros());

Un método estático sólo puede acceder a los miembros static de la clase (no tiene definida la referencia this).

Llamada a un método estático: NomClase.metodo(). Math.random(); Math.pow(10.,2);

Page 19: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

19Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS ABSTRACTOS (ABSTRACT)

Son métodos no implementados, sin código, que implementarán más adelante las clases heredadas. Representan a operaciones abstractas. Se declaran con la palabra reservada abstract.

public abstract class Electrodomestico { public abstract void encender(); public abstract int getPotencia ();

Una clase con un método abstracto debe declararse abstracta (abstract).

No se pueden crear instancias de una clase abstracta.

Page 20: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

20Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS Y MENSAJES

Un programa orientado a objetos consiste en un número de objetos que se comunican unos con otros a través del envío de mensajes.

Los mensajes relacionan unos objetos con

otros y con el mundo exterior.En POO la acción se inicia por la transmisión de un mensaje a un objeto. En respuesta al mensaje, el receptor ejecutará algún método.

Los métodos son como los procedimientos. Un método puede definirse como un programa procedimental que está asociado a un objeto y cuya ejecución sólo puede desencadenarse a través de un mensaje recibido por éste o por sus descendientes.

Un mensaje es la petición a un objeto de que ejecute uno de sus métodos. Los componentes de un mensaje son el nombre del receptor, el método invocado y la información necesaria para ejecutar el método.

Un mensaje equivale a una llamada a un método o función miembro .

Page 21: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

21Ignacio Zahonero MartínezLuis Joyanes Aguilar

TIPOS DE OPERACIONES (MÉTODOS)

Operaciones gerente: se encargan de la inicialización/destrucción y asignación de objetos. Son los métodos miembro constructor/ destructor.

Operaciones de desarrollo. Representan el interfaz principal de la clase. Proporcionan los requisitos funcionales. Por ejemplo, en la clase Cuenta retirar(); en la clase Ventana minimizar(), darColor(), ... .

Operaciones de acceso. La ocultación de información encapsula la representación interna de los objetos de la clase, protegiendo los datos de modificaciones aleatorias. Con las operaciones de acceso se permite obtener información de ciertos atributos (son lo métodos get(); por ejemplo, String getApellido()). La operación int altoV() de la clase Ventana, que devuelve el atributo alto, es una operación de acceso.

Modificadores, permiten a un programa cliente cambiar los contenidos de los miembros dato. Por ejemplo, de la clase Racional, void setNumerador(int n).

Iteradores, procesan collecciones de objetos, tales como listas, colas.

Operaciones de ayuda. Realizan tareas auxiliares necesarias para otras operaciones. El acceso está restringido a la clase, son funciones privadas.

Operaciones de cálculo. Realizan operaciones matemáticas.

Page 22: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

22Ignacio Zahonero MartínezLuis Joyanes Aguilar

EJEMPLO DE DECLARACIÓN DE UNA CLASE

public class Cuenta

{

protected double saldo;

public Cuenta()

{

saldo = 100.0;

}

public double saldoActual() {

return saldo;

}

public void

depositar(double cantidad)

{

saldo += cantidad;

}

public

double retirar (double cuanto)

{

if (cuanto <= saldo)

{

saldo -= cuanto;

return cuanto;

}

else

return 0.0;

}

Page 23: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

23Ignacio Zahonero MartínezLuis Joyanes Aguilar

INSTANCIAS DE UNA CLASE: OBJETOS

Después de definir una clase se puede declarar una instancia de esa clase.

Una variable de tipo clase no es un objeto. En Java se dice que es una referencia.

Lampara mp; // variable de tipo Lampara Racional r1; // variable de tipo Racional

Persona p1; // variable de tipo Persona

Ventana [] av = new Ventana[10];

En Java, las instancias de las clases se definen con el operador new seguido del nombre de la clase y entre paréntesis la información para inicializar el objeto.

Cuenta c1;

c1 = new Cuenta(); // El objeto Cuenta se referencia con c1

Racional r = new Racional(1,5); // objeto Racional inicializado a 1/5

cl.depositar(200.5); // objeto cl envía mensaje depositar

Page 24: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

24Ignacio Zahonero MartínezLuis Joyanes Aguilar

PROCESO DE CREACCIÓN DE UN OBJETO

new NombreClase(inforamción al constructor) // crea un objeto

1. Al crear el primer objeto de la clase, o utilizar un miembro static, se localiza la clase y se carga en memoria.

2. Se ejecutan los inicializadores static.

3. Cada vez que se crea un nuevo objeto:

reserva de memoria para almacenar el objeto asigna valores por defecto a atributos inicializadores del objeto(para clases anónimas) constructor

Page 25: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

25Ignacio Zahonero MartínezLuis Joyanes Aguilar

CONSTRUCTORES DE UN OBJETO

Un constructor es el mecanismo que disponen las clase para inicializar los objetos.

El constructor se llama automáticamente cuando se crea una instancia de la clase. Por ejemplo:

Ventana v1 = new Ventana(); // llama al constructor sin argumentos

Complex z1 = new Complex(-1.,1.);

El propósito de un constructor es inicializar los miembros dato (atributos o variables instancia).

El constructor es una método de la clase, tiene el mismo nombre de la clase y no tiene tipo de retorno. Formato general:

NombleClase(lista de argumentos)

{

...

}

El constructor puede estar sobrecargado, es decir, mas de un constructor con distintos argumentos.

Page 26: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

26Ignacio Zahonero MartínezLuis Joyanes Aguilar

EJEMPLOS DE CONSTRUCTORES(I)

class Circulo

{

private int x, y;

private double radio;

public Circulo(int x0, int y0, double r)

{

radio = r;

x = x0;

y = y0;

}

public Circulo(double r)

{

this(0, 0, r);

}

public Circulo()

{

this(0, 0, 1.0);

}

// instancias de Circulo

Circulo cc1 = new Circulo();

Circulo cc2 = new Circulo(3.0);

Circulo d;

d = new Circulo(-1, 1, 4.5);

Normalmente los constructores son públicos. No tienen tipo de retorno.

Page 27: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

27Ignacio Zahonero MartínezLuis Joyanes Aguilar

EJEMPLOS DE CONSTRUCTORES(II)

public class Asignatura{ private int numCredito = 2; private int curso = 1; private String idt = " "; public Asignatura(int c ) { curso = c; } public Asignatura(int c, String d) { curso = c; idt = d; } public Asignatura(int c, String d, int nc) { this(c, d); numCredito = nc; }

public class VectorEntero

{

private int n, cap;

private int[] v;

public VectorEntero() { this(50); }

public VectorEntero(int t)

{

v = new int [cap = t];

n = -1;

}

public VectorEntero(int [] w)

{

cap = 2 * w.length;

v = new int [cap];

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

v[i] = w[i];

n = w.length;

}

Un constructor por defecto no tiene parámetros. Inicializa los miembros datos a valores por defecto

Page 28: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

28Ignacio Zahonero MartínezLuis Joyanes Aguilar

CONSTRUCTORES

Cuando se define un objeto (instanciación), se pasan los valores de los parámetros al constructor utilizando una sintaxis similar a una llamada a un método.

Por ejemplo, para crear una instancia del objeto Rectángulo:

Rectangulo r1 = new Rectangulo(15, 20); // en Java

El operador new invoca automáticamente al constructor del objeto que se crea.

A continuación, se crean diferentes objetos Asignatura llamando a los constructores sobrecargados de la clase:

Asignatura una = new Asignatura(2); Asignatura dos = new Asignatura(1, "Fundamentos"); Asignatura trs = new Asignatura(3, "ADO", 4);

Ahora objetos de la colección VectorEntero:

VectorEntero v1 = new VectorEntero(); // constructor por defecto VectorEntero v2 = new VectorEntero(20);// capacidad 20 elementos int [] w = {2, 4, 6, 8}; VectorEntero v3 = new VectorEntero(w); // inicializado a w

Page 29: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

29Ignacio Zahonero MartínezLuis Joyanes Aguilar

LIBERAR O DESTRUIR UN OBJETO

En Java, el entorno de ejecución dispone de un recolector de basura (garbage collector) que se encarga de esta tarea. La recolección de basura recoge los objetos cuando determina que no se van a utilizar más, es decir, cuando no son referenciados por ninguna otra variable de ningún método activo.

Por ejemplo:

Rectangulo r1 = new Rectangulo(15, 20); // en Java

...

r1 = new Ractangulo(2,5);// objeto Rectangulo(15,20)candidato a liberación

Antes de que el objeto sea recolectado, el recolector de basura le da la oportunidad de "hacer algo" llamando al método finalize() (protected void finalize()) de la clase; se puede utilizar para realizar operaciones como el cierre de archivos o anular referencias a otros objetos para que en la siguiente vuelta el recolector los marque como basura.

System.gc(), es un método explícito que devuelve (libera) la memoria ocupada por un objeto marcado, es decir candidato a liberarse.

Page 30: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

30Ignacio Zahonero MartínezLuis Joyanes Aguilar

OBJETOS COMPUESTOS

Los objetos que contienen otros objetos se conocen como objetos compuestos. Un ejemplo de un objeto compuesto es la clase Aula. Una aula consta de diversas

partes, tales como una Pizarra, una Tarima y 30(n) Pupitres. Estas partes constituyen los objetos componentes del objeto Aula.

Cada objetos componente es un atributo del objeto compuesto. A su vez, los objetos componentes tienen atributos y métodos que los caracterizan.

Los objetos componentes tienen una relación part-of (parte-de) o component-of (componente-de) con el objetos compuesto, también se representa por has-a (tiene-un). Así, el Motor es parte de un Avión, la Bodega es parte del Avión,..., ¿el piloto es parte del avión?.

En la mayoría de los sistemas los objetos no contienen en el sentido estricto otros objetos, sino que contienen referencias a otros objetos. Esta característica ofrece dos ventajas:

1. Los objetos contenidos pueden cambiar en tamaño y composición, sin afectar al objeto compuesto que los contiene.

2. Los objetos contenidos están libres para participar en cualquier número de objetos compuestos, en lugar de estar bloqueados en un único objeto compuesto.

Los objetos contenidos en objetos compuestos pueden por sí mismo ser objetos compuestos, dando lugar a una jerarquía de componentes-de.

Page 31: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

31Ignacio Zahonero MartínezLuis Joyanes Aguilar

OBJETOS COMPUESTOS(II)

Cuando se crea una instancia de un objeto compuesto, todos sus objetos componentes se deben instanciar al mismo tiempo. Por esa razón, normalmente los argumentos del constructor de objetos miembros se sitúan en la declaración de la clase que lo

contiene. Por ejemplo, suponer la relación parte-de entre Tiempo y Panel:

public class Tiempo

{

private int h, m, s;

public Tiempo(int _h, int _m, int _s)

{

h = _h; m = _m; s = _s;

System.out.println("Hora inicial: " + h +

":" + m + ":" + s);

}

public Tiempo(){ this(0,0,0); }

public class Panel

{

private String titulo;

private Tiempo t;

public Panel(String nomr)

{

titulo = nomr; t = new Tiempo();

}

public Panel(String n, int h, int m, int s)

{

titulo = nomr; t = mew Tiemp(h, m, s)

}

Page 32: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

32Ignacio Zahonero MartínezLuis Joyanes Aguilar

COPIA Y DESTRUCCIÓN DE OBJETOS

Dos variables de tipo clase se pueden asignar. En Java, esta asignación no supone que se copien los objetos, simplemente se asignan las referencias.

Complex z1 = new Complex(2,-3); // z1 objeto inicializado a 2 – 3iComplex z2 = new Complex(3,1); // z2 inicializado a 3 + i

z2 = z1; // el objeto Complex(3,1) ya no es referenciado por z2, // el objeto Complex(2,-3) se referencia(identifica) por z2 y z1

Un objeto que no está referenciado es candidato a ser "destruido" por el sistema (garbage collection).

Color n1 = new Color("red");

Color n2 = new Color (10,30,20);

n1 = n2;

El objeto Color("red") deja de estar referenciado (identificado), puede ser liberado por el sistema.

n1 = null; // null: palabra reservada; se utiliza para indicar referencia nula.

El objeto Color (10,30,20) deja de estar referenciado (identificado), puede ser liberado por el sistema.

Page 33: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

33Ignacio Zahonero MartínezLuis Joyanes Aguilar

AUTOREFERENCIA: THIS

¿ Cómo reconoce un método de una clase cuál es la instancia que la llama ?. Suponer la clase Pila:

class Pila

{

public void meter(int x)

{

buffer[++cima] = x;

}

¿Cómo sabe meter() que buffer o cima es de la pila p1 o p2 ?

this es una palabra reservada especial, que se declara implícitamente para cada clase y tiene la dirección del objeto que envía el mensaje (invoca al método).

Siempre que se llama a un método se pasa, implícitamente, this . De este modo el método conoce el objeto (la instancia) que llamó. Los atributos o miembros dato están referenciados,

implícitamente, por this . this se puede utilizar explícitamente para que un método devuelva el el objeto que envía el

mensaje: return this; Otro uso de this es para llamar desde un constructor a otro de la misma clase.

Pila p1 = new Pila();Pila p2 = new Pila();

p1.meter(19);p2.meter(29);

Page 34: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

34Ignacio Zahonero MartínezLuis Joyanes Aguilar

CLASE OBJECT

En Java, todas las clases son clases derivadas que proceden de la superclase Object del paquete java.lang, por consiguiente una variable de tipo Object puede referirse a cualquier objeto.

public void alimentar(Object q) Se puede llamar al método pasando cualquier tipo de objeto. Por ejemplo: Racional r = new Racional(8,1);

alimentar(r);

O bien, alimentar(new Integer(8));

La clase Object define algunos métodos que son heredados por todos los objetos;

algunos de esos métodos son de utilidad general.

Page 35: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

35Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS DE LA CLASE OBJECT(I)

public boolean equals(Object obj) Compara el objeto receptor con el objeto referido por obj. Si son iguales devuelve true y

en caso contrario false. Pregunta no por la igualdad de la referencia, sino por la igualdad de los valores.

En muchas ocasiones, será conveniente redefinirlo en nuestras clases . class Empleado { public boolean equals(Object q) { Empleado e = (Empleado)q; return this.nombre == e.nombre; } public String toString() Devuelve una representación en forma de cadena de texto del objeto. Se llama de forma

implícita cada vez que se utiliza el objeto donde el sistema espera una cadena. Es posible y recomendable sobrescribirlo para adaptarlo a un objeto en particular. Por ejemplo, para la clase Primitiva:

public String toString() { return "Boleto: " + num[0]+num[1]+num[2]+num[3]+num[4]+num[5];}

Primitiva p = new Primitiva(); ... System.out.println(p);

Page 36: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

36Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS DE LA CLASE OBJECT(II)

protected Object clone() throws CloneNotSupportedException

Devuelve un clon de un objeto, es decir una copia del objeto sobre el que se invoca, con el mismo estado que tenía. Los cambios que se hagan sobre el clon no afectan a la instancia original.

Para poder hacer un clon de objetos de una clase, esta debe implementar el interface Clonable y redefinir el método clone(). Por ejemplo, para la clase Alumno:

public class Alumno implements Cloneable

{ private String nom;

private Direccion dir;

...

public Object clone() {

Alumno a = null;

try {

a = (Alumno)super.clone(); //versión de la clase base }catch(CloneNotSupportedException e){;} a.nom = (String) a.nom.clone(); // clon de String

a.dir = (Direccion) a.dir.clone(); // clon de dirección

return a;

}

Alumno b1 = new Alumno(...)

Alumno b2 = (Alumno)b1.clone()

Page 37: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

37Ignacio Zahonero MartínezLuis Joyanes Aguilar

MÉTODOS DE LA CLASE OBJECT(III)

protected void finalize() throws Throwable El método finalize se llama cuando un objeto es requerido para eliminar por el

recolector de basura. Se puede sobrescribir para determinar las acciones a realizar cuando se elimina un objeto.

public class Empleado { protected void finalize() { System.out.println("Se está liberando el empleado de nombre: "+ nombre); }

La llamada a System.runFinalizersOnExit(true) solicita la ejecución de los métodos finalize() cuando una aplicación termina.

public int hashcode()Devuelve el código hash que identifica la instancia. Se utiliza para almacenar el objeto en

colecciones.

Page 38: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

38Ignacio Zahonero MartínezLuis Joyanes Aguilar

DIFERENCIA ENTRE CLASE Y OBJETO

Un objeto es un simple elemento, no importa los complejo que pueda ser.

Una clase describe a una familia de elementos similares.

En la práctica, una clase se asemeja a un esquema o plantilla, que se utiliza para crear objetos.

Una clase es un tipo definido que determina la estructura de datos y operaciones asociadas con ese tipo.

A partir de una clase se pueden definir un número ilimitado de objetos. Cada uno de estos objetos tendrá un estado particular propio ( un objeto ventana puede estar minimizada, otra puede estar dimensionada a mitad de pantalla, y otras características como su color), aunque compartan algunas operaciones comunes (como ocultar).

Los datos internos de un objeto definen su estado actual.

Un objeto se comunica con otros objetos pasando mensajes.

Un objeto es una instancia de una clase.

Page 39: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

39Ignacio Zahonero MartínezLuis Joyanes Aguilar

UNA APLICACIÓN

Se declaran y definen dos clases Reloj y Presentar con la finalidad de mostrar el avance del tiempo.

El comportamiento de Presentar:

• Escribir en pantalla el valor asociado.• Incrementar el valor cíclicamente, dentro de un rango. • Establecer el límite superior del rango. El límite inferior será siempre cero.

El comportamiento de Reloj:

• Inicializar el dato (atributo) hora y el dato minuto.• Incrementar en 1 los minutos. Si llega a 60 minutos incrementar las horas.• Mostrar la hora y los minutos actuales.

Una vez definidas las clases Presentar y Reloj es preciso usar las mismas. Se escribe otra clase, se puede denominar clase

principal, con el método main(). Este método controla la creación del objeto Reloj y simula su funcionamiento con un bucle.

Page 40: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

40Ignacio Zahonero MartínezLuis Joyanes Aguilar

CLASE PRESENTAR

class Presentar

{

private int limite, valor;

public Presentar(int lim)

{ valor = 0;

limite = lim;

}

public Presentar incr()

{

valor++;

if (valor == limite) valor = 0;

return this; // objeto que envía el mensaje

}

public Presentar ponValor(int v)

{

if (v < 0) v = -v;

valor = v % limite;// rango 0 .. limite-1

return this;

}

public int obtenValor()

{

return valor;

}

public int obtenLimite()

{

return limite;

}

public Presentar mostrar()

{

if (valor < 10)

System.out.print ('0');

System.out.print(valor);

return this;

}

}

Page 41: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

41Ignacio Zahonero MartínezLuis Joyanes Aguilar

CLASE RELOJ (I)

class Reloj

{

private Presentar hora;

private Presentar minuto;

private BufferedReader entrada = new

BufferedReader (new

InputStreamReader(System.in));

private int entradaInt() throws Exception

{

int q;

q = Integer.parseInt(entrada.readLine());

return q;

}

public Reloj() // construye objeto hora y minuto

{

hora = new Presentar(24);

minuto = new Presentar(60);

}

public Reloj incrementar()

{

minuto.incr(); // aumenta 1 minuto

if (minuto.obtenValor() == 0)

hora.incr();

return this;

}

Page 42: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

42Ignacio Zahonero MartínezLuis Joyanes Aguilar

CLASE RELOJ (II)

public Reloj mostrar()

{

hora.mostrar();

System.out.print(" : ");

minuto.mostrar();

System.out.println();

return this;

}

public Reloj fijar() throws Exception

{

int inicio;

System.out.println(

"Fijar horas, entre 0 y " +

hora.obtenLimite() + ": ");

inicio = entradaInt();

hora.ponValor(inicio);

System.out.println(

"Fijar minutos, entre 0 y " +

minuto.obtenLimite() + ": ");

inicio = entradaInt();

minuto.ponValor(inicio);

return this;

}

}

Page 43: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

43Ignacio Zahonero MartínezLuis Joyanes Aguilar

PROGRAMA QUE MANEJA RELOJ

public class PruebaReloj

{

static PrintStream salida = System.out;

public static void main(String[] args)

throws Exception

{

Reloj t;

t = new Reloj();

salida.println("Valor inicial ");

t.mostrar();

t.mostrar().fijar(); // concatena mensajes

salida.print( "Tiempo de partida ");

t.mostrar();

// bucle de incremento del reloj

for (int i = 0; i < 60; i++)

{

t.incrementar();

if (i % 6 == 0)

{

t.incrementar().mostrar();

}

}

}

}

Page 44: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

Ignacio Zahonero MartínezLuis Joyanes Aguilar

EJEMPLO: CLASE PRIMITIVA

Escribir una clase que permita obtener un boleto de 6 números al azar comprendidos 1 y 49. La clase debe tener, al menos , el método rellenarBoleto() y devolverBoleto(). En la clase de prueba (PruebaPrimitiva), el método main debe crear uno, o más objetos primitiva y mostrar por pantalla cada boleto.

Page 45: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

45Ignacio Zahonero MartínezLuis Joyanes Aguilar

Implementación

El archivo fuente con la clase debe tener el nombre de la clase y la extensión .java Primitiva.java

import java.util.Arrays;

public class Primitiva {

int numeros[] = new int[49];

private int boleto[] = new int[6];

public Primitiva()

{

for(int i = 0; i <=48;i++)

numeros[i] = i+1;

}

Page 46: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

46Ignacio Zahonero MartínezLuis Joyanes Aguilar

Primitiva.java

private int sacarNumero() {

int n; int i;

do

i = (int)(Math.random()*49);

while(numeros[i] == 0);

n = numeros[i];

numeros[i] = 0;

return n;

}

public void rellenarBoleto()

{

for(int i = 0;i<=5;i++)

boleto[i]=this.sacarNumero();

Arrays.sort(boleto);

}

Page 47: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

47Ignacio Zahonero MartínezLuis Joyanes Aguilar

Primitiva.java

public String devolverBoleto(){ StringBuffer s = "";

for(int i = 0;i <= boleto.length - 1;i++)

s += boleto[i] + " ";

String r = new String(s);

return r;

}

public void escribirArray(int [] b){

for(int i = 0;i <= b.length - 1;i++)

System.out.print(b[i] + " ");

System.out.println("");

}

}

Page 48: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

48Ignacio Zahonero MartínezLuis Joyanes Aguilar

PruebaPrimitiva.java

Clase con el método main(), punto de entrada de la aplicación. El sistema carga la clase principal y llama a su método main

public class PruebaPrimitiva

{

public static void main(String args[])

{ Primitiva p = new Primitiva(); p.escribirArray(p.numeros); p.rellenarBoleto(); System.out.println(p.devolverBoleto()); }

}

Page 49: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

Ignacio Zahonero MartínezLuis Joyanes Aguilar

EJERCICIOS

CLASES EN JAVA

Page 50: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

50Ignacio Zahonero MartínezLuis Joyanes Aguilar

Ejercicio 1.

Diseñar e implementar una clase para representar una hoja de calendario, clase HojaCalendario.

atributos de la clase:·   día, mes y año de tipo int.·   numDiaSemana(int), diaSemana (String), mesNom(String) y notas (String).   métodos de la clase:·   Constructor por defecto. Inicializa al primer día del año. ·   Constructor que inicialice día y mes (int). Además, inicializa mesNom según el valor de

mes..·   ponerNota(String s) establece el campo nota a s, o bien concatena si ya existe una nota.·   ponerDiaSem (int nd) establece el campo días de la semana (1 = Lunes, ...).·   ponerAño(int a)·   toString(). Redefinición del método toString() con el fin de que devuelva una cadena con

la fecha de la hoja.·   finalize(). Redefinir finalize() para mostrar por pantalla datos del objeto que es

"recolectado".·   ponerDia(int d, int m). Cambia día y mes con los valores de los argumentos. ·   darNota(). Devuelve las notas de la hoja.método static void main() para realizar pruebas con objetos de la clase. Se ha de probar

cada uno de los métodos.

Page 51: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

51Ignacio Zahonero MartínezLuis Joyanes Aguilar

Ejercicio 2.

Diseñar e implementar la clase Calendario que agrupa los 365 (366 si bisiesto) días del año.atributos de la clase:array (puede utilizarse un Vector o ArrsyList) de tipo HojaCalendario (ejercicio .día, mes actual.bisiesto (boolean)días del año.año.primer día del año (1, 2, ... 7).miembros static con los nombres de los meses y de los días de la semana.Métodos de la clase:constructor con el argumento año. Establece el año, determina si es bisiesto y crea el array.

Además, inicializa el día y mes actual a 1 Enero, y el primer día de año a lunes (1). constructor con el argumento año y día de la semana. Realiza las mismas acciones que el

constructor anterior, y además inicializa el primer día del año.crearCalendario(). Instancia – crea – los objetos HojaCalendario.pasarHoja(). Cambia a la siguiente hoja del calendario.romperHoja(int dia, int mes). "Marca" la hoja, correspondiente al dia/mes, para ser liberada. ponerNotasDia(int dia, int mes, String n). Escribe la nota n en la hoja del calendario.notasDia(int dia, int mes). Devuelve las notas escritas en la hoja correspondiente al

dia/mes .

Page 52: Ignacio Zahonero Martínez Luis Joyanes Aguilar Curso Programación en Java Tema 5 Clases y Objetos.

52Ignacio Zahonero MartínezLuis Joyanes Aguilar

Ejercicio 3. (Está relacionado con el ejercicio 2)

Escribir una sencilla aplicación (clase con método main) con estas tareas:

• Instanciar dos objetos Calendario, aplicando respectivamente los dos constructores.

• Crear las hojas de cada calendario.• Codificar el método seleccionar(Calendario a, int diaSemana int mes) que

muestre por pantalla las notas de las hojas del calendario del mes y diaSemana. El prototipo del método es: void seleccionar(Calendario a, int diaSemana int mes)

• Probar cada uno de los métodos de la clase Calendario y el método seleccionar()