Clases y objetos en Java

Índice
Clases ... 3 Las clases en Java ... 4 Un ejemplo de clase: Punto ... 6 Los objetos en Java ... 8 Variables de tipos primitivos frente a variables de objetos ... 11 Las variables de objetos son referencias ... 12 Público y privado ... 18 Interfaz e implementación ... 21 Una clase Punto correcta ... 22 Dentro (de la clase) y fuera (de los objetos) ... 24 Categorías de métodos ... 25 Ejercicio: una clase Contador ... 26 Inicialización de objetos: los constructores ... 27 Los atributos ... 29
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

Curso de Java

Clases y objetos en Java
El lenguaje Java — Tema 4 — Clases y objetos

...
Tema 4 – Clases y objetos - 1

Clases y objetos en Java
Otro ejemplo de clase: Circulo ... 30 Convenios de denominación ... 31 Un problema con la clase Circulo ... 32 Representaciones gráficas ... 35 Un mundo de objetos ... 40 Ejercicio: mejora de la clase Contador ... 57 Paso de objetos a métodos ... 58 Atributos de ejemplar y atributos de clase ... 70 Atributos compartidos ... 71 Métodos de ejemplar y métodos de clase ... 76 La palabra clave this ... 78 La vida de los objetos ... 79 Clonación de objetos ... 80 Ejercicio: una clase Usuario ... 82 Ejercicio: mejora de la clase Usuario ... 86
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 2

Clases
Una clase es una implementación de un tipo abstracto de datos.
datos atributos + + operaciones métodos TAD Clase

Las clases, como los TAD, son declaraciones. Ejemplares (lo que existe durante la ejecución): variables para un TAD, objetos para una clase. Los datos se identifican como atributos en la clase: cada ejemplar (objeto) de la clase tendrá sus propios atributos. Todos los objetos de una clase tienen definido un mismo conjunto de métodos (operaciones). Encapsulación de código y datos: la clase como módulo. Ocultación de información: público/privado (interfaz/implementación).

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 3

Las clases en Java: la estructura class
Una clase define un determinado tipo de objetos. Características de los objetos: Atributos (datos que contienen) Métodos (operaciones que se les puede aplicar) La estructura class engloba las declaraciones de atributos y métodos:
Nombre de la clase

Las clases en Java: atributos y métodos
Los atributos son variables. El tipo puede ser otra clase o un tipo primitivo de Java (int, double, etcétera). Se declaran fuera de todos los métodos. Los métodos son declaraciones de funciones que contienen el código que se ejecutará cuando se invoquen. class Clase { // Declaraciones de atributos // Declaraciones de atributos // Declaraciones de atributos // ... // Declaración de método // Declaración de método // Declaración de método // ... }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 5

class Clase { // Declaraciones de atributos y métodos }

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 4

Un ejemplo de clase: Punto
class Punto { double _x; // atributo _x double _y; // atributo _y
2 atributos y 5 métodos

Un ejemplo de clase: Punto
La clase no puede ejecutarse por sí misma.
Es una definición que nos permite crear y manipular objetos de esa clase. La creación y manipulación de objetos se llevará a cabo en alguna otra clase del programa. Tal como está definida la clase anterior, sólo se conocerá en el paquete en el que se encuentre.
_x _y x():double x(double) y():double y(double) print() Punto

double x() { // método x() return _x; } Sin método main() double y() { // método y() No se puede ejecutar return _y; } void x(double d) { // método x(double) _x = d; } void y(double d) { // método y(double) _y = d; } void print() { // método print() System.out.print("(" + _x + "," + _y + ")"); } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 6

En el mismo archivo fuente puede haber otras clases, como por ejemplo una que contenga el programa principal (el método main() con el que comenzará la ejecución).

UML

Vamos a crear en el mismo archivo fuente un programa principal que cree y manipule objetos de la clase Punto.

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 7

Los objetos en Java
Los objetos se manejan a través de las variables. Se declaran normalmente, pero utilizando el nombre de la clase como tipo: NombreClase nombreObjeto; Por ejemplo: Punto miPunto; Esto tan sólo declara una variable de ese tipo (clase), pero NO crea nada. Los objetos se han de crear explícitamente utilizando el operador new: nombreObjeto = new NombreClase(); Por ejemplo: miPunto = new Punto(); Ahora ya sí existe un objeto de clase Punto que se puede utilizar a través de la variable miPunto.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 8

Los objetos en Java
¿Qué podemos hacer con el objeto? Acceder a sus características: atributos y métodos. Para acceder a las características se utiliza la notación punto: nombreObjeto.característica; Por ejemplo: miPunto._x miPunto._y miPunto.x() miPunto.print() ...
Objeto receptor del mensaje: miPunto. Mensaje que se le pasa: x().

Si se trata de un método, deberán incluirse los paréntesis (y los argumentos, si es que tiene definidos parámetros). La ejecución de un método se dice que es un paso de mensaje.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 9

Los objetos en Java
class Punto { ... } public class Prueba { // Programa principal public static void main(String[] args) { Punto p = new Punto(); p.x(3); p.print(); } }
Muestra (3.0,0.0) Los atributos se inicializan automáticamente

Variables de tipos primitivos frente a variables de objetos
Las variables que hemos utilizado hasta ahora, las que declaramos de algún tipo primitivo (int, double, etcétera), son contenedores de valores: la variable y su valor se consideran la misma cosa. int unNumero = 4, otroNumero = 10;
unNumero 4 otroNumero 10

Así, cuando se asigna una variable a otra, lo que se hace es copiar el valor de una a la otra: otroNumero = unNumero;
unNumero 4 otroNumero 4 unNumero == otroNumero true

Prueba.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 10

Las variables de objetos no funcionan de la misma forma ...
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 11

Las variables de objetos son referencias
Las variables de objetos son referencias: la variable referencia a un objeto, una entidad aparte que contiene atributos y responde a ciertas operaciones (los métodos definidos en la clase). Punto unPunto = new Punto(); Punto otroPunto = new Punto();
unPunto otroPunto

Las variables de objetos son referencias
Los objetos se manejan a través de sus referencias (variables). Un objeto sólo se puede utilizar a través de alguna referencia suya. unPunto.x(4); otroPunto.y(7);
unPunto otroPunto

_x 0.0 _y 0.0

_x 0.0 _y 0.0

_x 4.0 _y 0.0

_x 0.0 _y 7.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 12

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 13

Las variables de objetos son referencias
Si se copian referencias (con el operador de asignación =), lo que se consigue es tener varias referencias apuntando a un mismo objeto. otroPunto = unPunto;
unPunto otroPunto Este objeto se ha perdido. Ya no se puede acceder a él de ninguna forma (no hay referencia que lo apunte)

Las variables de objetos son referencias
Si se comparan dos referencias con el operador de igualdad (==), lo que se comprueba es si apuntan al mismo objeto o no (no se comprueba si los dos objetos son iguales). otroPunto == unPunto en este momento es true.
unPunto otroPunto

_x 4.0 _y 0.0

_x 0.0 _y 7.0

_x 4.0 _y 0.0

_x 0.0 _y 7.0

El “recolector de basura” (garbage collector) entra en acción
Tema 4 – Clases y objetos - 14 Curso de Java

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 15

Las variables de objetos son referencias
Punto unPunto = new Punto(); unPunto.x(4); Punto otroPunto = new Punto(); otroPunto.x(4); otroPunto == unPunto ahora es false.
unPunto otroPunto Aunque los dos objetos tengan el mismo estado (mismos valores en sus respectivos atributos). Las variables referencias no se inicializan automáticamente. unPunto = null; indicaría que unPunto no apunta a ningún objeto.
Tema 4 – Clases y objetos - 16

Las variables de objetos son referencias
class Punto { ... }

_x 4.0 _y 0.0

_x 4.0 _y 0.0

public class Referencias { public static void main(String[] args) { Punto uno = new Punto(); uno.x(3); uno.y(7); uno.print(); System.out.println(); Punto dos = uno; dos.print(); System.out.println(); if(uno == dos) System.out.println("Son el mismo objeto"); dos = new Punto(); dos.print(); System.out.println(); if(uno != dos) System.out.println("No son el mismo objeto"); dos.x(15); dos.y(23); uno.print(); System.out.println(); dos.print(); System.out.println(); } } Referencias.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 17

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Público y privado: las clases
Las clases por defecto son “propias” del paquete (package) en el que están definidas. Es decir, son conocidas en cualquier otra clase del mismo paquete, pero no se podrán usar en otros programas o paquetes. Para que se puedan usar en otros programas o paquetes se deben declarar como “públicas”, usando el modificador de acceso public: public class ... En cada archivo fuente sólo puede haber una clase pública. Lo normal es declarar cada clase en su propio archivo fuente. También los atributos y los métodos son, por defecto, conocidos en todas las clases del paquete en el que se encuentra su clase. Pero a los atributos y los métodos se les puede aplicar tanto el modificador de de acceso public como el modificador de acceso private.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 18

Público y privado: atributos y métodos
Un atributo o método public se conocerá en cualquier otro programa o paquete, pudiendo ser entonces accedido por medio de objetos de esa clase (con la notación punto). Un atributo o método private sólo se conoce en la propia clase en la que está definido, pudiendo ser accedido tan sólo en ella. Los métodos serán públicos si constituyen servicios que los objetos proporcionan al exterior y privados si son funciones auxiliares de la clase. Las directrices de la programación orientada a objetos nos aseguran un menor riesgo de errores en los programas si: Los atributos se declaran siempre como privados. La manipulación de los atributos se realiza, consecuentemente, por medio de métodos (públicos, claro).
Luis Hernández Yáñez Carlos Cervigón Rückauer

Curso de Java

Tema 4 – Clases y objetos - 19

Público y privado: accedentes y mutadores
Como los atributos deben ser siempre privados, a menudo necesitaremos ciertos métodos que nos permitan establecer u obtener los valores de los atributos:

Interfaz e implementación
Todo aquello que esté declarado como público en la clase constituirá la interfaz de la clase, lo que puede ser utilizado en otras clases. Como hemos visto, la interfaz va a venir dada por: El nombre de la clase. Las signaturas de los métodos públicos. Todo lo que no es parte de la interfaz es parte de la implementación: Los atributos. Los métodos privados. Los cuerpos de todos los métodos. La implementación no tiene por qué ser conocida para poder utilizar la clase. Lo único que necesitamos conocer es la interfaz.

Accedente: método que nos devuelve el valor de un atributo. Mutador: método que nos permite ajustar el valor de un atributo.
Normalmente tendremos un accedente y un mutador por cada atributo. Aunque habrá ocasiones en las que no proceda que haya accedentes o (sobre todo) mutadores, para evitar que el programador que use la clase pueda alterar un valor que deba ser ajustado tan sólo por la propia clase.

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 20

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 21

Una clase Punto más correcta
public class Punto { Atributos privados private double _x; private double _y; public double x() { // accedente return _x; } Servicios que public double y() { // accedente proporciona la clase: return _y; métodos públicos } public void x(double d) { // mutador _x = d; } A menudo los public void y(double d) { // mutador atributos se _y = d; colocan al final } public void print() { System.out.print("(" + _x + "," + _y + ")"); } } Punto.java Todo lo que no es interfaz es implementación
Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 22

Una clase Punto más correcta
Lo privado (los atributos) está aislado del exterior, siendo accesible sólo por el código de los métodos de la clase. Ahora, un código como este no compilará: Punto p; p = new Punto(); p._x = 7; // ERROR No se permite acceder al atributo _x. Hay que usar un mutador: p.x(7); // OK
_x x() x(double) y() y(double) print() _y

I N T E R F A Z

Protegidos frente a accesos desde el exterior Accesibles desde el interior

Curso de Java

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 23

Dentro (de la clase) y fuera (de los objetos)
La clase (dentro del objeto) Se conocen los atributos. Se conocen todos los métodos (públicos o privados). Implementa los métodos: En el método se trabaja sobre o con el objeto receptor. Para pasar otro mensaje al objeto receptor basta invocar el correspondiente método (sin poner ni receptor ni punto). El método puede utilizar también objetos locales y objetos parámetros.
Curso de Java

Categorías de métodos
En las clases se pueden identificar distintas categorías de métodos: Métodos accedentes: devuelven el contenido de los atributos (cada accedente devuelve un atributo) – x(). Métodos mutadores: establecen el contenido de los atributos (cada mutador, el contenido de un atributo) – x(double). Métodos visualizadores: muestran el objeto (valores de los atributos o alguna representación visual del objeto) – print(). Métodos inicializadores: inicializan atributos. Métodos computadores: realizan cálculos y generan resultados. Otros. En algunas clases no tendrán sentido ciertos tipos de métodos: Por ejemplo, en una clase Pila no debe haber accedentes ni mutadores, ya que se trata de una máquina de datos que se usa sólo mediante operaciones como la inserción y la eliminación.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 25

Desde fuera del objeto No se conocen sus atributos. No se conocen sus métodos privados. Sólo se conocen los servicios que proporciona (métodos públicos). Se utiliza pasándole mensajes. Paso de mensaje:

objeto.mensaje(...)

Se ejecuta el código del método con igual nombre que esté definido en su clase (y con parámetros que concuerden).
Tema 4 – Clases y objetos - 24

Luis Hernández Yáñez Carlos Cervigón Rückauer

Ejercicio: una clase Contador
Crea una clase que se denomine Contador y que defina un único atributo _contador (un entero). El contador se podrá inicializar a cualquier valor no negativo. Otros servicios que han de proporcionar los objetos de esta clase: Obtener / ajustar el valor del contador. Incrementar / decrementar el contador (en una unidad). Mostrar el valor actual del contador. El contador nunca podrá tener un valor negativo. Prueba la clase con un programa principal que cree varios contadores y use sobre ellos todos los métodos existentes. Comprueba también el comportamiento de las variables referencias. Usa los modificadores de acceso public y private de acuerdo con las directrices de la POO.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 26

Inicialización de objetos: los constructores
Aunque Java realiza una inicialización automática de los atributos, a menudo los valores que se asignan por defecto no son adecuados para nuestras necesidades o podemos necesitar indicar cuáles han de ser esos valores de inicialización. Para realizar una inicialización personalizada de los atributos disponemos de los constructores, unos métodos especiales. Los constructores se llaman igual que las clases (son excepciones de la regla de comienzo por minúscula para los métodos). public Punto() { _x = 1; No se indica ningún tipo para el método. _y = 1; Esa información la añade automáticamente el compilador } Ahora, cuando se creen objetos (new Punto()) se establecerán las dos coordenadas (atributos) con el valor 1.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 27

Inicialización de objetos: los constructores
Los constructores se pueden sobrecargar, de forma que podemos incluir otro en la clase Punto: public Punto(double cx, double cy) { _x = cx; _y = cy; } Ahora podemos crear objetos de la clase Punto proporcionando los valores deseados para las dos coordenadas: Punto p = new Punto(3,7); Si no se proporcionan argumentos, se ejecuta automáticamente el constructor predeterminado (el que no tiene parámetros). Y si no se proporciona ningún constructor, el compilador añade uno predeterminado por su cuenta (que inicializa siempre por defecto).
Por esto se crean los objetos con el nombre de la clase seguida de paréntesis.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 28

Los atributos
Atributos: datos de tipos previamente definidos (primitivos) o ejemplares (objetos) de otras clases. Si se usan variables de tipos primitivos se habla a veces de programación mixta o híbrida (P.O.O. + Programación con tipos). Java incluye clases envoltorios para los tipos primitivos (Integer), lo que permite una POO pura. Si un atributo es un objeto de otra clase, simplemente se maneja en la implementación como tal, pasándole mensajes. Cuando una clase A hace uso de otra clase B al utilizar en su implementación objetos de esa clase B (al pasar mensajes a atributos, parámetros o variables locales que son objetos de esa clase), se dice que la clase A es cliente de la clase B. Primer tipo de relación que se establece entre las clases:

Relación de clientelismo
Luis Hernández Yáñez Carlos Cervigón Rückauer

Curso de Java

Tema 4 – Clases y objetos - 29

Otro ejemplo de clase: Circulo
public class Circulo { public Circulo() { _radio = 0; } // Constructor public Circulo(Punto p, double r) { // Constructor _centro = p; _radio = r; Devolución de objeto } public double radio() { return _radio; } public Punto centro() { return _centro; } public void radio(double r) { _radio = r; } public void centro(Punto p) { _centro = p; } public void print() { Objeto parámetro System.out.print("["); _centro.print(); // Pasa mensaje al objeto atributo System.out.print("," + _radio + "]"); } private double _radio; private Punto _centro; // Atrib. objeto de otra clase }
La clase Circulo es cliente de la clase Punto
Luis Hernández Yáñez Carlos Cervigón Rückauer Curso de Java

Convenios de denominación
Para dar nombre a los elementos de los programas se puede utilizar cualquier convenio de denominación, pero lo mejor es utilizar uno y ser consecuente. Aquí vamos a seguir las siguientes reglas: Los identificadores se escribirán en general en minúsculas, a excepción, en los casos que se indique, de ciertas letras. Las clases comenzarán por mayúscula: Punto, Circulo. Los atributos comenzarán por subrayado: _centro, _x. Los métodos comenzarán por minúscula: print(), centro(). (Excepción: constructores, que se llaman igual que la clase.) Lo objetos comenzarán por minúscula: objeto1, punto. Métodos accedentes: nombre del atributo sin subrayado: x(), y(). Métodos mutadores: nombre del atributo sin subrayado: x(), y(). Identificadores compuestos por varias palabras: la segunda y siguientes palabras llevarán su primera letra en mayúscula: listaObjetosGraficos, CirculoColor.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 31

Circulo.java

Tema 4 – Clases y objetos - 30

Un problema con la clase Circulo
El constructor predeterminado de la clase Circulo sólo inicializa explícitamente el atributo _radio, por lo que el otro atributo (_centro) es inicializado automáticamente por el compilador. Como se trata de una referencia a objeto, se inicializa a null (lo que significa que no hace referencia aún a ningún objeto). Entonces, corremos el riesgo de que se produzca un error en el método print():
public void print() { System.out.print("["); _centro.print(); System.out.print("," + _radio + "]"); }

Un problema con la clase Circulo
Podemos solucionar este problema de dos formas: 1. Comprobando si la referencia apunta a un objeto antes de intentar pasar el mensaje. 2. Asegurándonos de que la referencia siempre apunte a un objeto. Con la primera solución el método print() quedará así:
public void print() { System.out.print("["); if(_centro == null) System.out.print("(null)"); else _centro.print(); System.out.print("," + _radio + "]"); }

Circulos.java

Si _centro es null, no apunta a ningún objeto; no se puede pasar mensaje alguno; el programa falla (eleva una excepción).
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 32

Ahora simplemente se muestra (null) como centro si no se ha asignado ningún Punto a _centro. Circulo2.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 33

Un problema con la clase Circulo
Con la segunda solución, el constructor predeterminado de la clase Circulo creará el objeto Punto para el _centro, de forma que todos los objetos Circulo que se creen dispongan desde el principio de su objeto Punto como _centro:
public Circulo3() { _radio = 0; _centro = new Punto(); }

Representaciones gráficas
Para representar gráficamente los elementos de los programas orientados a objetos y sus relaciones vamos a utilizar diagramas similares a los de UML que se usan en Ingeniería del Software. A medida que vayamos estudiando los conceptos y los mecanismos de la POO iremos viendo cómo representarlos gráficamente. De momento, comencemos con la representación de las clases: Nombre Atributos
Nombre de la clase Atributos definidos en la clase Métodos definidos en la clase

El constructor predeterminado de la clase Punto (añadido automáticamente en este caso por el compilador) se encarga de inicializar los atributos del Punto. Nos aseguramos así de que todo se inicializará adecuadamente (encadenamiento de inicializaciones). Circulo3.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 34 Curso de Java

Métodos

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 35

Representaciones gráficas
Las representaciones gráficas de las clases se pueden desarrollar con distintos niveles de detalle. Con el mayor nivel de detalle se incluyen todas las características (atributos y métodos) definidas en la clase.
Punto _x _y x():double x(double) y():double y(double) print() Circulo _centro _radio Circulo() Circulo(Punto,double) centro():Punto centro(Punto) radio():double radio(double) print() Métodos: Nombre seguido de los tipos de los parámetros separados por comas y entre paréntesis. Si la función devuelve un valor, el tipo de valor que devuelve se coloca al final y precedido de :

Representaciones gráficas
Si interesa se pueden omitir secciones o dejarlas en blanco. Por ejemplo, para mostrar la forma en que se usan los objetos de una clase, la parte de atributos no es relevante, por lo que la podemos dejar en blanco:
Punto x():double x(double) y():double y(double) print() Circulo Circulo() Circulo(Punto,double) centro():Punto centro(Punto) radio():double radio(double) print()

Se pueden quitar del todo secciones por el final; es decir, si la que se deja en blanco es la de métodos, al ser la última sí se puede quitar, pero como la de atributos no es la última, estará en blanco.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 37

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 36

Representaciones gráficas
Si lo que se quiere es omitir la información sobre métodos, entonces se puede dejar en blanco o se puede quitar del todo:
Punto _x _y Circulo _centro _radio

Representaciones gráficas
Relaciones entre clases Las relaciones entre las clases también se representan gráficamente. La única relación entre clases que hemos visto es la de clientelismo: Los objetos de la clase Circulo contienen objetos de la clase Punto. La relación de clientelismo se representa conectando las clases mediante líneas con un rombo en un extremo. El rombo se coloca en la clase que contiene objetos de la otra:
Circulo Punto

Se pueden quitar las dos secciones de atributos y métodos, dejando simplemente el nombre de la clase; es el menor nivel de detalle:
Punto Circulo

Podemos indicar el número de objetos que se contienen:
Circulo
Luis Hernández Yáñez Carlos Cervigón Rückauer

1

Punto

Curso de Java

Tema 4 – Clases y objetos - 38

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 39

Un mundo de objetos
¿Cuántos objetos se crean en el siguiente programa? ¿Cuántos quedan inaccesibles (se pierden)?
public class Objetos { public static void main(String[] args) { Circulo c1 = new Circulo(); Punto p1 = new Punto(); c1.radio(7); c1.centro(p1); Circulo c2 = new Circulo(p1, 13); Punto p2 = new Punto(5, 2); c1.centro(p2); Circulo c3 = c2; p1 = new Punto(1, 1); c3.centro(p1); } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

Un mundo de objetos
Circulo c1

c1

?

Objetos.java
Tema 4 – Clases y objetos - 40 Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 41

Un mundo de objetos
Circulo c1 new Circulo();

Un mundo de objetos
Circulo c1 new Circulo();
_radio = 0;

c1

c1

?

?

_radio

_radio

?
_centro

0.0 ?
_centro

?

?

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 42

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 43

Un mundo de objetos
Circulo c1 new Circulo();
_radio = 0; new Punto();

Un mundo de objetos
Circulo c1 new Circulo();
_radio = 0; _centro = new Punto();

c1

c1

?

?

_radio

_radio

0.0
_centro _x

0.0
_centro _x

?

0.0
_y

0.0
_y

0.0

0.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 44

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 45

Un mundo de objetos
Circulo c1 = new Circulo();

Un mundo de objetos
Circulo c1 = new Circulo(); Punto p1 = new Punto();

c1

c1

p1

_x

0.0
_y _radio _radio

0.0

0.0
_centro _x

0.0
_centro _x

0.0
_y

0.0
_y

0.0

0.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 46

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 47

Un mundo de objetos
Circulo c1 = new Circulo(); Punto p1 = new Punto(); c1.radio(7);

Un mundo de objetos
Circulo c1 = new Circulo(); Punto p1 = new Punto(); c1.radio(7); public void centro(Punto p) { c1.centro(p1); _centro = p;
}
_x c1 p1 _x

c1

p1

0.0
_y _radio

0.0
_y _radio

0.0

0.0

7.0
_centro _x

7.0
_centro _x

0.0
_y

0.0
_y

0.0

0.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 48

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 49

Un mundo de objetos
Circulo c1 = new Circulo(); Punto p1 = new Punto(); c1.radio(7); c1.centro(p1);
c1 p1 _x

Un mundo de objetos
Punto p1 = new Punto(); c1.radio(7); c1.centro(p1); Circulo c2 = new Circulo(p1, 13);
c1 p1 _x c2

0.0
_y _radio

0.0
_y _radio

0.0

0.0

_radio

7.0
_centro _x

7.0
_centro _x

13.0
_centro

0.0
_y

0.0
_y

0.0
PERDIDO Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 50 Curso de Java

0.0
PERDIDO Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 51

Un mundo de objetos
c1.radio(7); c1.centro(p1); Circulo c2 = new Circulo(p1, 13); Punto p2 = new Punto(5, 2);
c1 p1 _x c2

Un mundo de objetos
c1.centro(p1); Circulo c2 = new Circulo(p1, 13); Punto p2 = new Punto(5, 2); c1.centro(p2);
c1 p1 _x c2

0.0
p2 _radio _y p2 _radio _radio

0.0
_y

0.0

0.0

_radio

7.0
_x _centro _x

13.0
_centro _x

7.0
_centro _x

13.0
_centro

5.0
_y

0.0
_y

5.0
_y

0.0
_y

2.0

0.0
PERDIDO

2.0

0.0
PERDIDO

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 52

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 53

Un mundo de objetos
Circulo c2 = new Circulo(p1, 13); Punto p2 = new Punto(5, 2); c1.centro(p2); Circulo c3 = c2;
c1 p1 _x c2 c3

Un mundo de objetos
Punto p2 = new Punto(5, 2); c1.centro(p2); Circulo c3 = c2; p1 = new Punto(1, 1);
c1 p1 _x c2 c3

0.0
p2 _radio _y p2 _radio _radio

0.0
_y

0.0

0.0

_radio

7.0
_x _centro _x

13.0
_centro _x

7.0
_centro _x _x

13.0
_centro

5.0
_y

0.0
_y

5.0
_y

0.0
_y

1.0
_y

2.0

0.0
PERDIDO

2.0

0.0
PERDIDO

1.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 54

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 55

Un mundo de objetos
c1.centro(p2); Circulo c3 = c2; p1 = new Punto(1, 1); c3.centro(p1);
c1 p1

Ejercicio: mejora de la clase Contador
5 variables referencias (p1 p2 c1 c2 c3) Se crean 6 objetos. Se pierden 2 objetos.
PERDIDO

Modifica la clase Contador del ejercicio anterior, de forma que la inicialización del atributo se realice siempre durante la creación de los objetos (constructores). Por defecto, el atributo se inicializará a 1. Prueba nuevamente la clase en un programa principal.

_x

c2

c3

0.0
p2 _radio _y

0.0

_radio

7.0
_x _centro _x _x

13.0
_centro

5.0
_y

0.0
_y

1.0
_y

2.0

0.0
PERDIDO

1.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 56

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 57

Paso de objetos a métodos
Cuando pasamos a métodos variables que son referencias, el paso de parámetro también se realiza por valor, pero el resultado, a efectos prácticos, es equivalente a un paso de parámetro por referencia. La variable en sí se pasa por valor, pero al tratarse de una referencia, el objeto al que referencia el argumento es el mismo que el que referencia el parámetro. Por ejemplo, supongamos que en una clase Parametros hay un método traslada() como el siguiente:
public void traslada(Punto p, double dx, double dy) { p.x(p.x() + dx); p.y(p.y() + dy); }

Paso de objetos a métodos
Cuando pasamos un punto al método, se copia el argumento (una referencia) en el parámetro (otra referencia). Como las referencias son iguales, el objeto al que apuntan es el mismo y cualquier modificación que hagamos sobre el objeto apuntado será efectiva.
public static void main(String[] args) { Punto p1 = new Punto(); Circulo c1 = new Circulo(p1, 13); c1.print(); System.out.println(); traslada(p1, 5, 13); c1.print(); System.out.println(); }

El método traslada el punto p una distancia dx en el eje de abscisas y una distancia dy en el eje de ordenadas.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 58 Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

Parametros.java
Tema 4 – Clases y objetos - 59

Paso de objetos a métodos
traslada(p1, 5, 13);

Paso de objetos a métodos
traslada(p1, 5, 13);
public void traslada(Punto p, double dx, double dy) { p.x(p.x() + dx); p.y(p.y() + dy); }

p1

p1

p

dx

dy

5.0

13.0

_x

_x

0.0
_y

0.0
_y

0.0

0.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 60

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 61

Paso de objetos a métodos
traslada(p1, 5, 13);
public void traslada(Punto p, double dx, double dy) { p.x(p.x() + dx); p.y(p.y() + dy); }
p1 p dx dy

Paso de objetos a métodos
traslada(p1, 5, 13);

p1

5.0

13.0

_x

_x

5.0
_y

5.0
_y

13.0

13.0

El objeto al que apunta el argumento p1 se ha visto afectado por las modificaciones realizadas dentro del método (a través del parámetro p).

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 62

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 63

Paso de objetos a métodos
Si dentro del método se cambia el parámetro referencia, haciendo que apunte a otro objeto, el argumento referencia no se verá afectado, de forma que después de la ejecución del método seguirá apuntando al mismo objeto que antes.
public static void main(String[] args) { Punto p1 = new Punto(); Circulo c1 = new Circulo(p1, 13); c1.print(); System.out.println(); otro(p1); c1.print(); System.out.println(); } public static void otro(Punto p) { Punto tmp = new Punto(4, 5); p = tmp; Parametros2.java }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 64

Paso de objetos a métodos
otro(p1); ... public static void otro(Punto p) { Punto tmp = new Punto(4, 5); p = tmp; }
p1

_x

0.0
_y

0.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 65

Paso de objetos a métodos
otro(p1); ... public static void otro(Punto p) { Punto tmp = new Punto(4, 5); p = tmp; }
p1 p

Paso de objetos a métodos
otro(p1); ... public static void otro(Punto p) { Punto tmp = new Punto(4, 5); p = tmp; }
p1 p tmp

_x

_x

_x

0.0
_y

0.0
_y

4.0
_y

0.0

0.0

5.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 66

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 67

Paso de objetos a métodos
otro(p1); ... public static void otro(Punto p) { Punto tmp = new Punto(4, 5); p = tmp; }
p1 p tmp

Paso de objetos a métodos
otro(p1); ... public static void otro(Punto p) { Punto tmp = new Punto(4, 5); p = tmp; }
p1

_x

_x

_x

0.0
_y

4.0
_y

0.0
_y

0.0

5.0

0.0

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 68

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 69

Atributos de ejemplar y atributos de clase
Todos los atributos que hemos declarado hasta ahora son atributos de ejemplar (o de “instancia”). Cada objeto de la clase que se cree tendrá su propio atributo, distinto de los atributos de los demás objetos. También podemos declarar atributos de clase, atributos compartidos por todos los objetos de la clase. Tan sólo hay un ejemplar del atributo, de forma que todos los objetos acceden a la misma zona de almacenamiento. Para declarar un atributo como de clase, basta añadir el modificador static en su declaración.
class Clase { private static int _cuantos = 0; // Atributo de clase private float _f; // Atributo de ejemplar ... Los atributos constantes se declaran }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

Atributos compartidos
class Clase { private static int _cuantos = 0; private float _f; public Clase() { _cuantos++; } public int cuantos() { return _cuantos; } } public class DeClase { public static void main(String[] args) { Clase c1 = new Clase(); Clase c2 = new Clase(); Clase c3 = new Clase(); System.out.println("Se han creado " + c3.cuantos() + " objetos."); } DeClase.java }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 71

como atributos de clase (final static)
Tema 4 – Clases y objetos - 70

Atributos compartidos

Atributos compartidos
Clase c1 = new Clase();

_cuantos 0 c1 _cuantos

_cuantos 1 0

_f

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 72

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 73

Atributos compartidos
Clase c2 = new Clase(); _cuantos 2 c1 _cuantos c2 _cuantos

Atributos compartidos
Clase c3 = new Clase(); _cuantos 3 c1 _cuantos c2 _cuantos c3 _cuantos

_f

_f

_f

_f

_f

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 74

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 75

Métodos de ejemplar y métodos de clase
El ejemplo anterior tiene un defecto. ¿Cómo podemos saber cuántos ejemplares (objetos) se han creado antes de que se haya creado el primero? Como todavía no se ha creado ninguno, no podemos pasar el mensaje cuantos() a ningún objeto. La solución se encuentra en los métodos de clase, métodos que se ejecutan cuando el mensaje se pasa a la propia clase. Para declarar un método como de clase, basta añadir el modificador static en su declaración.
class Clase { private static int _cuantos = 0; ... public static int cuantos() { // Método de clase return _cuantos; } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 76

Métodos de ejemplar y métodos de clase
class Clase { private static int _cuantos = 0; ... public static int cuantos() { // Método de clase return _cuantos; } } public class DeClase2 { public static void main(String[] args) { System.out.println("Se han creado " + Clase.cuantos() + " objetos."); Clase c1 = new Clase(); Clase c2 = new Clase(); Clase c3 = new Clase(); System.out.println("Se han creado " + c3.cuantos() + " objetos."); } }
Luis Hernández Yáñez Carlos Cervigón Rückauer

DeClase2.java
Tema 4 – Clases y objetos - 77

Curso de Java

La palabra clave this
Si dentro de un método se necesita hacer referencia al objeto receptor del correspondiente mensaje, se puede usar this. Por ejemplo, si un parámetro se llama igual que un atributo, entonces se puede acceder al atributo a través de this:
class Clase { int dato = 0; void dato(int dato) { this.dato = dato; } }

La vida de los objetos
En Java es el sistema el que se encarga de destruir los objetos. El entorno de ejecución de Java dispone de un recolector de basura que destruye los objetos (liberando su memoria) cuando detecta que los objetos ya no son accesibles (se han perdido). Cuando ya no hay ninguna variable que haga referencia a un objeto, bien directamente o bien mediante atributos de otros objetos, entonces el recolector de basura sabe que puede eliminar el objeto sin riesgos.

Receptor.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 78 Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 79

Clonación de objetos
La copia de referencias, como hemos visto, tan sólo hace que las dos referencias apunten al mismo objeto. Si necesitamos obtener una copia de un objeto, debemos encargarnos nosotros mismos de hacer las copias oportunas. Basta con que añadamos en cada clase un método copia() que devuelva una copia del objeto receptor. El método creará un objeto de la clase, copiará en él los atributos del objeto receptor que sean valores simples (tipos primitivos) o pedirá una copia de los atributos que sean objetos a las correspondientes clases, y devolverá el objeto creado (que será una copia del receptor).
public class Punto { public Punto copia() { Punto tmp = new Punto(); tmp._x = _x; tmp._y = _y; return tmp; } ...
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

Clonación de objetos
public class Circulo { public Circulo copia() { Circulo tmp = new Circulo(); tmp._radio = _radio; tmp._centro = _centro.copia(); return tmp; } ... public class Clonacion { public static void main(String[] args) { Circulo4 c1 = new Circulo4(); c1.print(); System.out.print(" "); Circulo4 c2 = c1.copia(); c2.print(); System.out.println(); c1.radio(4); c1.print(); System.out.print(" "); c2.print(); System.out.println(); Punto3 p = new Punto3(1, 1); c2.centro(p); c1.print(); System.out.print(" "); c2.print(); System.out.println(); } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer

Circulo4.java

Punto3.java
Tema 4 – Clases y objetos - 80

Clonacion.java
Tema 4 – Clases y objetos - 81

Ejercicio: una clase Usuario
Crea una clase Usuario que maneje los siguientes datos: Identificador del usuario (_idUsuario, un entero). Contador de accesos al sistema (_accesos). Contador de intentos de acceso fallidos (_fallidos). Cada usuario tendrá un identificador distinto de los de los demás usuarios. Se asignará el último número asignado más uno. Para los contadores se utilizará la clase Contador del ejercicio anterior, pero inicializando a cero por defecto. La clase será usada por otra denominada Sistema que será la que cree Usuarios y les notifique los accesos válidos o fallidos. A los objetos de la clase Usuario se les podrá pasar un mensaje println() para que muestren toda su información disponible. Sistema.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 82

Ejercicio: una clase Usuario
Algunas pistas sobre la clase Usuario : Deberá haber un atributo de clase (_total, por ejemplo) que se inicialice a cero y se incremente cada vez que se cree un objeto de la clase (en el constructor, claro). El valor incrementado será el identificador del nuevo Usuario. El constructor deberá crear los dos contadores. No tiene sentido que haya métodos mutadores en la clase, ya que el identificador se asigna automáticamente y los contadores solamente se incrementan cuando se notifica un acceso o un fallo. Habrá un método hasAccedido() que notifica al Usuario que ha conseguido acceder al sistema. Habrá un método hasFallado() que notifica al Usuario que no ha conseguido acceder al sistema.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 83

Ejercicio: una clase Usuario
Una ayuda: la interfaz de la clase Usuario. class Usuario { public Usuario() { ... } public int idUsuario() { ... } public Contador accesos() { ... } public Contador fallidos() { ... } public void hasAccedido() { ... } public void hasFallado() { ... } public void println() { ... } }

Ejercicio: una clase Usuario
Otra ayuda: el programa principal.
public class Sistema { public static void main(String[] args) { Usuario u1 = new Usuario(); u1.println(); u1.hasAccedido(); u1.hasAccedido(); u1.hasFallado(); u1.println(); Usuario u2 = new Usuario(); u2.hasFallado(); u2.hasFallado(); u2.hasFallado(); u2.println(); } }

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 84

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 4 – Clases y objetos - 85

Ejercicio: mejora de la clase Usuario
Añade en las clases los métodos copia() necesarios para que se pueda clonar un objeto de la clase Usuario. Prueba la clonación en el programa principal.

¿Qué problema tiene el programa que has obtenido? (Investiga si la secuencia de identificadores que se asigna según se crean objetos es realmente correcta ahora.)

Sistema2.java
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 4 – Clases y objetos - 86