Está en la página 1de 22

Clases y objetos en Java

Índice
Clases ... 3
Las clases en Java ... 4
Curso de Java 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
Clases y objetos en Java 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 ...
El lenguaje Java — Tema 4 — Clases y objetos
Luis Hernández Yáñez
Curso de Java Tema 4 – Clases y objetos - 1
Carlos Cervigón Rückauer

Clases y objetos en Java Clases

Otro ejemplo de clase: Circulo ... 30 Una clase es una implementación de un tipo abstracto de datos.
Convenios de denominación ... 31 datos + operaciones TAD
Un problema con la clase Circulo ... 32
atributos + métodos Clase
Representaciones gráficas ... 35
Un mundo de objetos ... 40 Las clases, como los TAD, son declaraciones.
Ejercicio: mejora de la clase Contador ... 57
Ejemplares (lo que existe durante la ejecución):
Paso de objetos a métodos ... 58 variables para un TAD, objetos para una clase.
Atributos de ejemplar y atributos de clase ... 70
Los datos se identifican como atributos en la clase:
Atributos compartidos ... 71
cada ejemplar (objeto) de la clase tendrá sus propios atributos.
Métodos de ejemplar y métodos de clase ... 76
La palabra clave this ... 78 Todos los objetos de una clase tienen definido un mismo conjunto
La vida de los objetos ... 79 de métodos (operaciones).
Clonación de objetos ... 80 Encapsulación de código y datos: la clase como módulo.
Ejercicio: una clase Usuario ... 82 Ocultación de información: público/privado (interfaz/implementación).
Ejercicio: mejora de la clase Usuario ... 86

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 2 Curso de Java Tema 4 – Clases y objetos - 3
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Las clases en Java: la estructura class Las clases en Java: atributos y métodos

Una clase define un determinado tipo de objetos. Los atributos son variables. El tipo puede ser otra clase
o un tipo primitivo de Java (int, double, etcétera).
Características de los objetos:
Se declaran fuera de todos los métodos.
9 Atributos (datos que contienen)
Los métodos son declaraciones de funciones que contienen
9 Métodos (operaciones que se les puede aplicar) el código que se ejecutará cuando se invoquen.
class Clase {
La estructura class engloba las declaraciones de atributos y // Declaraciones de atributos
métodos: // Declaraciones de atributos
// Declaraciones de atributos
Nombre de la clase // ...
// Declaración de método
class Clase { // Declaración de método
// Declaraciones de atributos y métodos // Declaración de método
} // ...
}

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 4 Curso de Java Tema 4 – Clases y objetos - 5
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Un ejemplo de clase: Punto Un ejemplo de clase: Punto

class Punto { 2 atributos y 5 métodos La clase no puede ejecutarse por sí misma. Punto
double _x; // atributo _x
double _y; // atributo _y Es una definición que nos permite crear y _x
_y
double x() { // método x() manipular objetos de esa clase.
return _x; La creación y manipulación de objetos se llevará x():double
} Sin método main() a cabo en alguna otra clase del programa. x(double)
double y() { // método y() Æ No se puede ejecutar y():double
return _y; Tal como está definida la clase anterior, y(double)
} sólo se conocerá en el paquete en el que print()
void x(double d) { // método x(double) se encuentre.
_x = d; UML
} En el mismo archivo fuente puede haber otras clases,
void y(double d) { // método y(double) como por ejemplo una que contenga el programa principal
_y = d; (el método main() con el que comenzará la ejecución).
}
void print() { // método print() Vamos a crear en el mismo archivo fuente un programa principal que
System.out.print("(" + _x + "," + _y + ")"); cree y manipule objetos de la clase Punto.
}
}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 4 – Clases y objetos - 6 Curso de Java Tema 4 – Clases y objetos - 7
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Los objetos en Java Los objetos en Java

Los objetos se manejan a través de las variables. Se declaran ¿Qué podemos hacer con el objeto?
normalmente, pero utilizando el nombre de la clase como tipo: Acceder a sus características: atributos y métodos.
NombreClase nombreObjeto;
Para acceder a las características se utiliza la notación punto:
Por ejemplo:
nombreObjeto.característica;
Punto miPunto;
Por ejemplo:
Esto tan sólo declara una variable de ese tipo (clase),
pero NO crea nada. Los objetos se han de crear explícitamente miPunto._x
utilizando el operador new: miPunto._y
Objeto receptor del mensaje: miPunto.
miPunto.x()
nombreObjeto = new NombreClase(); Mensaje que se le pasa: x().
miPunto.print()
Por ejemplo: ...
miPunto = new Punto(); Si se trata de un método, deberán incluirse los paréntesis
Ahora ya sí existe un objeto de clase Punto que se puede utilizar (y los argumentos, si es que tiene definidos parámetros).
a través de la variable miPunto. La ejecución de un método se dice que es un paso de mensaje.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 8 Curso de Java Tema 4 – Clases y objetos - 9
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Los objetos en Java Variables de tipos primitivos frente a variables de objetos

class Punto { 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.
public class Prueba { int unNumero = 4, otroNumero = 10;
// Programa principal
unNumero otroNumero
public static void main(String[] args)
{ 4 10
Punto p = new Punto();
p.x(3); Así, cuando se asigna una variable a otra, lo que se hace es
p.print(); copiar el valor de una a la otra:
}
} otroNumero = unNumero;
unNumero otroNumero
Muestra (3.0,0.0) Æ Los atributos se inicializan automáticamente
4 4 unNumero == otroNumero Æ true

Prueba.java Las variables de objetos no funcionan de la misma forma ...

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 10 Curso de Java Tema 4 – Clases y objetos - 11
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Las variables de objetos son referencias Las variables de objetos son referencias

Las variables de objetos son referencias: la variable referencia a Los objetos se manejan a través de sus referencias (variables).
un objeto, una entidad aparte que contiene atributos y responde Un objeto sólo se puede utilizar a través de alguna referencia suya.
a ciertas operaciones (los métodos definidos en la clase).
unPunto.x(4);
Punto unPunto = new Punto(); otroPunto.y(7);
Punto otroPunto = new Punto();

unPunto otroPunto unPunto otroPunto

_x _x _x _x
0.0 0.0 4.0 0.0
_y _y _y _y
0.0 0.0 0.0 7.0

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 12 Curso de Java Tema 4 – Clases y objetos - 13
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Las variables de objetos son referencias Las variables de objetos son referencias

Si se copian referencias (con el operador de asignación =), Si se comparan dos referencias con el operador de igualdad (==),
lo que se consigue es tener varias referencias apuntando lo que se comprueba es si apuntan al mismo objeto o no
a un mismo objeto. (no se comprueba si los dos objetos son iguales).
otroPunto = unPunto; otroPunto == unPunto en este momento es true.

unPunto otroPunto unPunto otroPunto

Este objeto se ha perdido.


Ya no se puede acceder a él
de ninguna forma (no hay
_x _x referencia que lo apunte) _x _x
4.0 0.0 4.0 0.0
_y _y _y _y
El “recolector de basura”
0.0 7.0 (garbage collector) 0.0 7.0
entra en acción

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 14 Curso de Java Tema 4 – Clases y objetos - 15
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Las variables de objetos son referencias Las variables de objetos son referencias

Punto unPunto = new Punto(); class Punto { ... }


unPunto.x(4); public class Referencias {
Punto otroPunto = new Punto(); public static void main(String[] args)
otroPunto.x(4); {
Punto uno = new Punto();
otroPunto == unPunto ahora es false. uno.x(3);
uno.y(7);
unPunto otroPunto uno.print(); System.out.println();
Aunque los dos objetos Punto dos = uno;
tengan el mismo estado dos.print(); System.out.println();
(mismos valores en sus if(uno == dos) System.out.println("Son el mismo objeto");
respectivos atributos). dos = new Punto();
dos.print(); System.out.println();
_x _x if(uno != dos) System.out.println("No son el mismo objeto");
Las variables referencias no se dos.x(15);
4.0 4.0 inicializan automáticamente. dos.y(23);
_y _y uno.print(); System.out.println();
unPunto = null;
dos.print(); System.out.println();
0.0 0.0
indicaría que unPunto }
no apunta a ningún objeto. } Referencias.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 16 Curso de Java Tema 4 – Clases y objetos - 17
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Público y privado: las clases Público y privado: atributos y métodos

Las clases por defecto son “propias” del paquete (package) Un atributo o método public se conocerá en cualquier otro
en el que están definidas. Es decir, son conocidas en cualquier programa o paquete, pudiendo ser entonces accedido por medio
otra clase del mismo paquete, pero no se podrán usar en de objetos de esa clase (con la notación punto).
otros programas o paquetes. Un atributo o método private sólo se conoce en la propia clase
Para que se puedan usar en otros programas o paquetes se deben en la que está definido, pudiendo ser accedido tan sólo en ella.
declarar como “públicas”, usando el modificador de acceso public:
) Los métodos serán públicos si constituyen servicios
public class ... que los objetos proporcionan al exterior
En cada archivo fuente sólo puede haber una clase pública. y privados si son funciones auxiliares de la clase.
Lo normal es declarar cada clase en su propio archivo fuente. Las directrices de la programación orientada a objetos nos aseguran
También los atributos y los métodos son, por defecto, conocidos un menor riesgo de errores en los programas si:
en todas las clases del paquete en el que se encuentra su clase. 9 Los atributos se declaran siempre como privados.
Pero a los atributos y los métodos se les puede aplicar tanto 9 La manipulación de los atributos se realiza, consecuentemente,
el modificador de de acceso public como el modificador por medio de métodos (públicos, claro).
de acceso private.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 18 Curso de Java Tema 4 – Clases y objetos - 19
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Público y privado: accedentes y mutadores Interfaz e implementación

Como los atributos deben ser siempre privados, a menudo Todo aquello que esté declarado como público en la clase
necesitaremos ciertos métodos que nos permitan establecer constituirá la interfaz de la clase, lo que puede ser utilizado
u obtener los valores de los atributos: en otras clases.
9 Accedente: método que nos devuelve el valor de un atributo. Como hemos visto, la interfaz va a venir dada por:
9 Mutador: método que nos permite ajustar el valor de un atributo. 9 El nombre de la clase.
Normalmente tendremos un accedente y un mutador por cada 9 Las signaturas de los métodos públicos.
atributo. Aunque habrá ocasiones en las que no proceda Todo lo que no es parte de la interfaz es parte de la implementación:
que haya accedentes o (sobre todo) mutadores, para evitar
que el programador que use la clase pueda alterar un valor 9 Los atributos.
que deba ser ajustado tan sólo por la propia clase. 9 Los métodos privados.
9 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.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 20 Curso de Java Tema 4 – Clases y objetos - 21
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Una clase Punto más correcta Una clase Punto más correcta

public class Punto {


private double _x; Atributos privados Lo privado (los atributos) está aislado del exterior, siendo accesible
private double _y; sólo por el código de los métodos de la clase.
I public double x() { // accedente Ahora, un código como
return _x;
N }
este no compilará:
Servicios que
T public double y() { // accedente proporciona la clase: Punto p; _x _y
E return _y; métodos públicos p = new Punto();
R } p._x = 7; // ERROR x() Protegidos
F public void x(double d) { // mutador frente a
A _x = d; No se permite acceder x(double) accesos
} al atributo _x. desde el
Z public void y(double d) { // mutador A menudo los
atributos se
y() exterior
_y = d; Hay que usar un mutador:
colocan al final Accesibles
} y(double)
p.x(7); // OK desde el
public void print() {
System.out.print("(" + _x + "," + _y + ")"); print() interior
}
} Todo lo que no es interfaz es implementación Punto.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 22 Curso de Java Tema 4 – Clases y objetos - 23
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Dentro (de la clase) y fuera (de los objetos) Categorías de métodos

La clase (dentro del objeto) Desde fuera del objeto En las clases se pueden identificar distintas categorías de métodos:
Se conocen los atributos. No se conocen sus atributos. 9 Métodos accedentes: devuelven el contenido de los atributos
No se conocen sus métodos (cada accedente devuelve un atributo) – x().
Se conocen todos los métodos
(públicos o privados). privados. 9 Métodos mutadores: establecen el contenido de los atributos
Implementa los métodos: (cada mutador, el contenido de un atributo) – x(double).
Sólo se conocen los servicios que
En el método se trabaja sobre proporciona (métodos públicos). 9 Métodos visualizadores: muestran el objeto (valores de los
atributos o alguna representación visual del objeto) – print().
o con el objeto receptor. Se utiliza pasándole mensajes.
9 Métodos inicializadores: inicializan atributos.
Para pasar otro mensaje al Paso de mensaje:
objeto receptor basta invocar 9 Métodos computadores: realizan cálculos y generan resultados.
objeto.mensaje(...)
el correspondiente método 9 Otros.
(sin poner ni receptor ni punto). Se ejecuta el código del método En algunas clases no tendrán sentido ciertos tipos de métodos:
El método puede utilizar con igual nombre que esté
definido en su clase (y con 9 Por ejemplo, en una clase Pila no debe haber accedentes ni
también objetos locales y
parámetros que concuerden). mutadores, ya que se trata de una máquina de datos que se
objetos parámetros.
usa sólo mediante operaciones como la inserción y la eliminación.
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 4 – Clases y objetos - 24 Curso de Java Tema 4 – Clases y objetos - 25
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Ejercicio: una clase Contador Inicialización de objetos: los constructores

Crea una clase que se denomine Contador y que defina un único Aunque Java realiza una inicialización automática de los atributos,
atributo _contador (un entero). a menudo los valores que se asignan por defecto no son adecuados
El contador se podrá inicializar a cualquier valor no negativo. para nuestras necesidades o podemos necesitar indicar cuáles
han de ser esos valores de inicialización.
Otros servicios que han de proporcionar los objetos de esta clase:
Para realizar una inicialización personalizada de los atributos
9 Obtener / ajustar el valor del contador. disponemos de los constructores, unos métodos especiales.
9 Incrementar / decrementar el contador (en una unidad). Los constructores se llaman igual que las clases (son excepciones
9 Mostrar el valor actual del contador. de la regla de comienzo por minúscula para los métodos).
El contador nunca podrá tener un valor negativo. public Punto() {
_x = 1;
Prueba la clase con un programa principal que cree varios _y = 1; No se indica ningún tipo para el método.
contadores y use sobre ellos todos los métodos existentes. Esa información la añade automáticamente el compilador
}
Comprueba también el comportamiento de las variables referencias.
Ahora, cuando se creen objetos (new Punto())
Usa los modificadores de acceso public y private de acuerdo
se establecerán las dos coordenadas (atributos) con el valor 1.
con las directrices de la POO.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 26 Curso de Java Tema 4 – Clases y objetos - 27
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Inicialización de objetos: los constructores Los atributos

Los constructores se pueden sobrecargar, de forma que podemos Atributos: datos de tipos previamente definidos (primitivos) o
incluir otro en la clase Punto: ejemplares (objetos) de otras clases.
public Punto(double cx, double cy) { Si se usan variables de tipos primitivos se habla a veces de
_x = cx; programación mixta o híbrida (P.O.O. + Programación con tipos).
_y = cy; Java incluye clases envoltorios para los tipos primitivos (Integer),
} lo que permite una POO pura.
Ahora podemos crear objetos de la clase Punto proporcionando los Si un atributo es un objeto de otra clase, simplemente se maneja en
valores deseados para las dos coordenadas: la implementación como tal, pasándole mensajes.
Punto p = new Punto(3,7); Cuando una clase A hace uso de otra clase B al utilizar en su
Si no se proporcionan argumentos, se ejecuta automáticamente el implementación objetos de esa clase B (al pasar mensajes a atributos,
constructor predeterminado (el que no tiene parámetros). parámetros o variables locales que son objetos de esa clase),
se dice que la clase A es cliente de la clase B.
Y si no se proporciona ningún constructor, el compilador añade uno
predeterminado por su cuenta (que inicializa siempre por defecto). Primer tipo de relación que se establece entre las clases:
Relación de clientelismo
Æ Por esto se crean los objetos con el nombre de la clase seguida de paréntesis.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 28 Curso de Java Tema 4 – Clases y objetos - 29
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Otro ejemplo de clase: Circulo Convenios de denominación

public class Circulo { Para dar nombre a los elementos de los programas se puede utilizar
public Circulo() { _radio = 0; } // Constructor cualquier convenio de denominación, pero lo mejor es utilizar uno y
public Circulo(Punto p, double r) { // Constructor ser consecuente. Aquí vamos a seguir las siguientes reglas:
_centro = p;
_radio = r; Devolución de objeto 9 Los identificadores se escribirán en general en minúsculas,
} a excepción, en los casos que se indique, de ciertas letras.
public double radio() { return _radio; } 9 Las clases comenzarán por mayúscula: Punto, Circulo.
public Punto centro() { return _centro; }
9 Los atributos comenzarán por subrayado: _centro, _x.
public void radio(double r) { _radio = r; }
public void centro(Punto p) { _centro = p; } 9 Los métodos comenzarán por minúscula: print(), centro().
public void print() { Objeto parámetro
(Excepción: constructores, que se llaman igual que la clase.)
System.out.print("["); 9 Lo objetos comenzarán por minúscula: objeto1, punto.
_centro.print(); // Pasa mensaje al objeto atributo
System.out.print("," + _radio + "]");
9 Métodos accedentes: nombre del atributo sin subrayado: x(), y().
} 9 Métodos mutadores: nombre del atributo sin subrayado: x(), y().
private double _radio; 9 Identificadores compuestos por varias palabras: la segunda y
private Punto _centro; // Atrib. objeto de otra clase siguientes palabras llevarán su primera letra en mayúscula:
}
La clase Circulo es cliente de la clase Punto Circulo.java listaObjetosGraficos, CirculoColor.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 30 Curso de Java Tema 4 – Clases y objetos - 31
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Un problema con la clase Circulo Un problema con la clase Circulo

El constructor predeterminado de la clase Circulo Podemos solucionar este problema de dos formas:
sólo inicializa explícitamente el atributo _radio,
1. Comprobando si la referencia apunta a un objeto
por lo que el otro atributo (_centro) es inicializado
antes de intentar pasar el mensaje.
automáticamente por el compilador.
2. Asegurándonos de que la referencia siempre apunte a un objeto.
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). Con la primera solución el método print() quedará así:
Entonces, corremos el riesgo de que se produzca un error public void print() {
System.out.print("[");
en el método print():
if(_centro == null) System.out.print("(null)");
public void print() { else _centro.print();
System.out.print("["); System.out.print("," + _radio + "]");
_centro.print(); }
System.out.print("," + _radio + "]");
} Circulos.java Ahora simplemente se muestra (null) como centro
si no se ha asignado ningún Punto a _centro.
Si _centro es null, no apunta a ningún objeto; no se puede pasar
mensaje alguno; el programa falla (eleva una excepción). Circulo2.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 32 Curso de Java Tema 4 – Clases y objetos - 33
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Un problema con la clase Circulo Representaciones gráficas

Con la segunda solución, el constructor predeterminado de la clase Para representar gráficamente los elementos de los programas
Circulo creará el objeto Punto para el _centro, de forma que orientados a objetos y sus relaciones vamos a utilizar diagramas
todos los objetos Circulo que se creen dispongan desde el similares a los de UML que se usan en Ingeniería del Software.
principio de su objeto Punto como _centro: A medida que vayamos estudiando los conceptos y los
public Circulo3() { mecanismos de la POO iremos viendo cómo representarlos
_radio = 0; gráficamente.
_centro = new Punto();
}
De momento, comencemos con la representación de las clases:

El constructor predeterminado de la clase Punto Nombre Nombre de la clase


(añadido automáticamente en este caso por el compilador)
se encarga de inicializar los atributos del Punto. Atributos Atributos definidos
en la clase
Nos aseguramos así de que todo se inicializará adecuadamente
(encadenamiento de inicializaciones).
Métodos Métodos definidos
en la clase
Circulo3.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 34 Curso de Java Tema 4 – Clases y objetos - 35
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Representaciones gráficas Representaciones gráficas

Las representaciones gráficas de las clases se pueden desarrollar Si interesa se pueden omitir secciones o dejarlas en blanco.
con distintos niveles de detalle. Por ejemplo, para mostrar la forma en que se usan los objetos de
Con el mayor nivel de detalle se incluyen todas las características una clase, la parte de atributos no es relevante, por lo que la
(atributos y métodos) definidas en la clase. podemos dejar en blanco:

Punto Circulo
Punto Circulo
_x _centro Métodos: x():double Circulo()
_y _radio Nombre seguido de los x(double) Circulo(Punto,double)
tipos de los parámetros y():double centro():Punto
x():double Circulo() separados por comas y(double) centro(Punto)
x(double) Circulo(Punto,double) y entre paréntesis. print() radio():double
y():double centro():Punto Si la función devuelve radio(double)
y(double) centro(Punto) un valor, el tipo de valor print()
print() radio():double que devuelve se coloca
radio(double) al final y precedido de :
Se pueden quitar del todo secciones por el final; es decir, si la que
print()
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.
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 4 – Clases y objetos - 36 Curso de Java Tema 4 – Clases y objetos - 37
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Representaciones gráficas Representaciones gráficas

Si lo que se quiere es omitir la información sobre métodos, Relaciones entre clases


entonces se puede dejar en blanco o se puede quitar del todo: Las relaciones entre las clases también se representan gráficamente.
Punto Circulo La única relación entre clases que hemos visto es la de clientelismo:
_x _centro Los objetos de la clase Circulo contienen objetos de la clase
_y _radio
Punto.
La relación de clientelismo se representa conectando las clases
Se pueden quitar las dos secciones de atributos y métodos, mediante líneas con un rombo en un extremo.
dejando simplemente el nombre de la clase; es el menor nivel de El rombo se coloca en la clase que contiene objetos de la otra:
detalle:
Circulo Punto
Punto Circulo

Podemos indicar el número de objetos que se contienen:


1
Circulo Punto

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 38 Curso de Java Tema 4 – Clases y objetos - 39
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Un mundo de objetos Un mundo de objetos

¿Cuántos objetos se crean en el siguiente programa? Circulo c1


¿Cuántos quedan inaccesibles (se pierden)?
public class Objetos {
public static void main(String[] args)
{
Circulo c1 = new Circulo(); c1
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);
}
} Objetos.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 40 Curso de Java Tema 4 – Clases y objetos - 41
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Un mundo de objetos Un mundo de objetos

Circulo c1 new Circulo(); Circulo c1 new Circulo();


_radio = 0;

c1 c1
? ?

_radio _radio
? 0.0
?
_centro _centro
? ?

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 42 Curso de Java Tema 4 – Clases y objetos - 43
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Un mundo de objetos Un mundo de objetos

Circulo c1 new Circulo(); Circulo c1 new Circulo();


_radio = 0; _radio = 0;
new Punto(); _centro = new Punto();

c1 c1
? ?

_radio _radio
0.0 0.0
_centro _x _centro _x
? 0.0 0.0
_y _y
0.0 0.0

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 44 Curso de Java Tema 4 – Clases y objetos - 45
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Un mundo de objetos Un mundo de objetos

Circulo c1 = new Circulo(); Circulo c1 = new Circulo();


Punto p1 = new Punto();

c1 c1 p1 _x
0.0
_y
0.0
_radio _radio
0.0 0.0
_centro _x _centro _x
0.0 0.0
_y _y
0.0 0.0

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 46 Curso de Java Tema 4 – Clases y objetos - 47
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Un mundo de objetos Un mundo de objetos

Circulo c1 = new Circulo(); Circulo c1 = new Circulo();


Punto p1 = new Punto(); Punto p1 = new Punto();
c1.radio(7); c1.radio(7); public void centro(Punto p) {
c1.centro(p1); _centro = p;
}
c1 p1 _x c1 p1 _x
0.0 0.0
_y _y
0.0 0.0
_radio _radio
7.0 7.0
_centro _x _centro _x
0.0 0.0
_y _y
0.0 0.0

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 48 Curso de Java Tema 4 – Clases y objetos - 49
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Un mundo de objetos Un mundo de objetos

Circulo c1 = new Circulo(); Punto p1 = new Punto();


Punto p1 = new Punto(); c1.radio(7);
c1.radio(7); c1.centro(p1);
c1.centro(p1); Circulo c2 = new Circulo(p1, 13);

c1 p1 _x c1 p1 _x c2

0.0 0.0
_y _y
0.0 0.0
_radio _radio _radio
7.0 7.0 13.0
_centro _x _centro _x _centro

0.0 0.0
_y _y
0.0 0.0

PERDIDO PERDIDO

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 50 Curso de Java Tema 4 – Clases y objetos - 51
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Un mundo de objetos Un mundo de objetos

c1.radio(7); c1.centro(p1);
c1.centro(p1); Circulo c2 = new Circulo(p1, 13);
Circulo c2 = new Circulo(p1, 13); Punto p2 = new Punto(5, 2);
Punto p2 = new Punto(5, 2); c1.centro(p2);

c1 p1 _x c2 c1 p1 _x c2

0.0 0.0
p2 _y p2 _y
0.0 0.0
_radio _radio _radio _radio
7.0 13.0 7.0 13.0
_x _centro _x _centro _x _centro _x _centro
5.0 0.0 5.0 0.0
_y _y _y _y
2.0 0.0 2.0 0.0

PERDIDO PERDIDO

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 52 Curso de Java Tema 4 – Clases y objetos - 53
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Un mundo de objetos Un mundo de objetos

Circulo c2 = new Circulo(p1, 13); Punto p2 = new Punto(5, 2);


Punto p2 = new Punto(5, 2); c1.centro(p2);
c1.centro(p2); Circulo c3 = c2;
Circulo c3 = c2; p1 = new Punto(1, 1);

c1 p1 _x c2 c3 c1 p1 _x c2 c3

0.0 0.0
p2 _y p2 _y
0.0 0.0
_radio _radio _radio _radio
7.0 13.0 7.0 13.0
_x _centro _x _centro _x _centro _x _x _centro
5.0 0.0 5.0 0.0 1.0
_y _y _y _y _y
2.0 0.0 2.0 0.0 1.0

PERDIDO PERDIDO

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 54 Curso de Java Tema 4 – Clases y objetos - 55
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Un mundo de objetos Ejercicio: mejora de la clase Contador

c1.centro(p2); 5 variables referencias (p1 p2 c1 c2 c3) Modifica la clase Contador del ejercicio anterior, de forma que
Circulo c3 = c2; Se crean 6 objetos. la inicialización del atributo se realice siempre durante la creación
p1 = new Punto(1, 1); Se pierden 2 objetos. de los objetos (constructores).
c3.centro(p1);
PERDIDO
Por defecto, el atributo se inicializará a 1.
c1 p1 _x c2 c3 Prueba nuevamente la clase en un programa principal.
0.0
p2 _y
0.0
_radio _radio
7.0 13.0
_x _centro _x _x _centro
5.0 0.0 1.0
_y _y _y
2.0 0.0 1.0

PERDIDO

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 56 Curso de Java Tema 4 – Clases y objetos - 57
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Paso de objetos a métodos Paso de objetos a métodos

Cuando pasamos a métodos variables que son referencias, Cuando pasamos un punto al método, se copia el argumento (una
el paso de parámetro también se realiza por valor, referencia) en el parámetro (otra referencia). Como las referencias
pero el resultado, a efectos prácticos, es equivalente son iguales, el objeto al que apuntan es el mismo y cualquier
a un paso de parámetro por referencia. modificación que hagamos sobre el objeto apuntado será efectiva.
La variable en sí se pasa por valor, pero al tratarse de una public static void main(String[] args) {
referencia, el objeto al que referencia el argumento es el mismo Punto p1 = new Punto();
que el que referencia el parámetro. Circulo c1 = new Circulo(p1, 13);
c1.print(); System.out.println();
Por ejemplo, supongamos que en una clase Parametros traslada(p1, 5, 13);
hay un método traslada() como el siguiente: c1.print(); System.out.println();
}
public void traslada(Punto p, double dx, double dy) {
p.x(p.x() + dx);
p.y(p.y() + dy);
}
El método traslada el punto p una distancia dx en el eje de abscisas
y una distancia dy en el eje de ordenadas. Parametros.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 58 Curso de Java Tema 4 – Clases y objetos - 59
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Paso de objetos a métodos Paso de objetos a métodos

traslada(p1, 5, 13); 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 0.0
_y _y
0.0 0.0

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 60 Curso de Java Tema 4 – Clases y objetos - 61
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Paso de objetos a métodos Paso de objetos a métodos

traslada(p1, 5, 13); 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 p1
5.0 13.0

El objeto al que apunta


_x _x
el argumento p1
se ha visto afectado
5.0 5.0
por las modificaciones
_y _y
realizadas dentro del método
13.0 13.0
(a través del parámetro p).

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 62 Curso de Java Tema 4 – Clases y objetos - 63
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Paso de objetos a métodos Paso de objetos a métodos

Si dentro del método se cambia el parámetro referencia, otro(p1);


haciendo que apunte a otro objeto, ...
el argumento referencia no se verá afectado, public static void otro(Punto p) {
Punto tmp = new Punto(4, 5);
de forma que después de la ejecución del método seguirá
p = tmp;
apuntando al mismo objeto que antes. }
public static void main(String[] args)
{ p1
Punto p1 = new Punto();
Circulo c1 = new Circulo(p1, 13);
c1.print(); System.out.println();
otro(p1);
_x
c1.print(); System.out.println();
} 0.0
public static void otro(Punto p) { _y
Punto tmp = new Punto(4, 5); 0.0
p = tmp;
} Parametros2.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 64 Curso de Java Tema 4 – Clases y objetos - 65
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Paso de objetos a métodos Paso de objetos a métodos

otro(p1); otro(p1);
... ...
public static void otro(Punto p) { public static void otro(Punto p) {
Punto tmp = new Punto(4, 5); Punto tmp = new Punto(4, 5);
p = tmp; p = tmp;
} }

p1 p p1 p tmp

_x _x _x
0.0 0.0 4.0
_y _y _y
0.0 0.0 5.0

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 66 Curso de Java Tema 4 – Clases y objetos - 67
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Paso de objetos a métodos Paso de objetos a métodos

otro(p1); otro(p1);
... ...
public static void otro(Punto p) { public static void otro(Punto p) {
Punto tmp = new Punto(4, 5); Punto tmp = new Punto(4, 5);
p = tmp; p = tmp;
} }

p1 p tmp p1

_x _x _x
0.0 4.0 0.0
_y _y _y
0.0 5.0 0.0

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 68 Curso de Java Tema 4 – Clases y objetos - 69
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Atributos de ejemplar y atributos de clase Atributos compartidos

Todos los atributos que hemos declarado hasta ahora class Clase {
son atributos de ejemplar (o de “instancia”). private static int _cuantos = 0;
private float _f;
Cada objeto de la clase que se cree tendrá su propio atributo, public Clase() {
distinto de los atributos de los demás objetos. _cuantos++;
También podemos declarar atributos de clase, }
public int cuantos() {
atributos compartidos por todos los objetos de la clase. return _cuantos;
Tan sólo hay un ejemplar del atributo, de forma que todos }
los objetos acceden a la misma zona de almacenamiento. }
public class DeClase {
Para declarar un atributo como de clase, public static void main(String[] args) {
basta añadir el modificador static en su declaración. Clase c1 = new Clase();
class Clase { Clase c2 = new Clase();
private static int _cuantos = 0; // Atributo de clase Clase c3 = new Clase();
private float _f; // Atributo de ejemplar System.out.println("Se han creado " + c3.cuantos() +
... " objetos.");
} Los atributos constantes se declaran }
como atributos de clase (final static) } DeClase.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 70 Curso de Java Tema 4 – Clases y objetos - 71
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Atributos compartidos Atributos compartidos

Clase c1 = new Clase();

_cuantos _cuantos
0 0
1

c1

_cuantos

_f

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 72 Curso de Java Tema 4 – Clases y objetos - 73
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Atributos compartidos Atributos compartidos

Clase c2 = new Clase(); Clase c3 = new Clase();

_cuantos _cuantos
2 3

c1 c2 c1 c2 c3

_cuantos _cuantos _cuantos _cuantos _cuantos

_f _f _f _f _f

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 74 Curso de Java Tema 4 – Clases y objetos - 75
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Métodos de ejemplar y métodos de clase Métodos de ejemplar y métodos de clase

El ejemplo anterior tiene un defecto. class Clase {


private static int _cuantos = 0;
¿Cómo podemos saber cuántos ejemplares (objetos) se han creado ...
antes de que se haya creado el primero? public static int cuantos() { // Método de clase
return _cuantos;
Como todavía no se ha creado ninguno, no podemos pasar }
el mensaje cuantos() a ningún objeto. }
public class DeClase2 {
La solución se encuentra en los métodos de clase, métodos que
public static void main(String[] args) {
se ejecutan cuando el mensaje se pasa a la propia clase. System.out.println("Se han creado " +
Para declarar un método como de clase, Clase.cuantos() + " objetos.");
basta añadir el modificador static en su declaración. Clase c1 = new Clase();
class Clase { Clase c2 = new Clase();
private static int _cuantos = 0; Clase c3 = new Clase();
... System.out.println("Se han creado " + c3.cuantos() +
public static int cuantos() { // Método de clase " objetos.");
return _cuantos; }
} }
DeClase2.java
}
Luis Hernández Yáñez Luis Hernández Yáñez
Curso de Java Tema 4 – Clases y objetos - 76 Curso de Java Tema 4 – Clases y objetos - 77
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

La palabra clave this La vida de los objetos

Si dentro de un método se necesita hacer referencia al objeto En Java es el sistema el que se encarga de destruir los objetos.
receptor del correspondiente mensaje, se puede usar this.
El entorno de ejecución de Java dispone de un recolector de basura
Por ejemplo, si un parámetro se llama igual que un atributo, que destruye los objetos (liberando su memoria) cuando detecta
entonces se puede acceder al atributo a través de this: que los objetos ya no son accesibles (se han perdido).
class Clase { Cuando ya no hay ninguna variable que haga referencia a un objeto,
int dato = 0; bien directamente o bien mediante atributos de otros objetos,
void dato(int dato) { entonces el recolector de basura sabe que puede eliminar
this.dato = dato;
el objeto sin riesgos.
}
}

Receptor.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 78 Curso de Java Tema 4 – Clases y objetos - 79
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Clonación de objetos Clonación de objetos

La copia de referencias, como hemos visto, tan sólo hace public class Circulo {
public Circulo copia() {
que las dos referencias apunten al mismo objeto. Circulo tmp = new Circulo();
Si necesitamos obtener una copia de un objeto, debemos tmp._radio = _radio;
tmp._centro = _centro.copia();
encargarnos nosotros mismos de hacer las copias oportunas. return tmp; Circulo4.java
Basta con que añadamos en cada clase un método copia() }
...
que devuelva una copia del objeto receptor. El método creará public class Clonacion {
un objeto de la clase, copiará en él los atributos del objeto receptor public static void main(String[] args) {
Circulo4 c1 = new Circulo4();
que sean valores simples (tipos primitivos) o pedirá una copia c1.print(); System.out.print(" ");
de los atributos que sean objetos a las correspondientes clases, Circulo4 c2 = c1.copia();
y devolverá el objeto creado (que será una copia del receptor). c2.print(); System.out.println();
c1.radio(4);
public class Punto { c1.print(); System.out.print(" ");
public Punto copia() { c2.print(); System.out.println();
Punto tmp = new Punto(); Punto3 p = new Punto3(1, 1);
c2.centro(p);
tmp._x = _x; c1.print(); System.out.print(" ");
tmp._y = _y; c2.print(); System.out.println();
return tmp; }
} ...
Punto3.java } Clonacion.java

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 80 Curso de Java Tema 4 – Clases y objetos - 81
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

Ejercicio: una clase Usuario Ejercicio: una clase Usuario

Crea una clase Usuario que maneje los siguientes datos: Algunas pistas sobre la clase Usuario :
9 Identificador del usuario (_idUsuario, un entero). 9 Deberá haber un atributo de clase (_total, por ejemplo)
9 Contador de accesos al sistema (_accesos). que se inicialice a cero y se incremente cada vez que
se cree un objeto de la clase (en el constructor, claro).
9 Contador de intentos de acceso fallidos (_fallidos).
El valor incrementado será el identificador del nuevo Usuario.
Cada usuario tendrá un identificador distinto de los de los demás
9 El constructor deberá crear los dos contadores.
usuarios. Se asignará el último número asignado más uno.
9 No tiene sentido que haya métodos mutadores en la clase,
Para los contadores se utilizará la clase Contador del ejercicio
ya que el identificador se asigna automáticamente y los
anterior, pero inicializando a cero por defecto.
contadores solamente se incrementan cuando se notifica
La clase será usada por otra denominada Sistema que será un acceso o un fallo.
la que cree Usuarios y les notifique los accesos válidos o fallidos.
9 Habrá un método hasAccedido() que notifica al Usuario
A los objetos de la clase Usuario se les podrá pasar un mensaje que ha conseguido acceder al sistema.
println() para que muestren toda su información disponible.
9 Habrá un método hasFallado() que notifica al Usuario
Sistema.java que no ha conseguido acceder al sistema.

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 82 Curso de Java Tema 4 – Clases y objetos - 83
Carlos Cervigón Rückauer Carlos Cervigón Rückauer
Ejercicio: una clase Usuario Ejercicio: una clase Usuario

Una ayuda: la interfaz de la clase Usuario. Otra ayuda: el programa principal.


public class Sistema {
public static void main(String[] args) {
class Usuario {
Usuario u1 = new Usuario();
public Usuario() { ... } u1.println();
public int idUsuario() { ... } u1.hasAccedido();
public Contador accesos() { ... } u1.hasAccedido();
public Contador fallidos() { ... } u1.hasFallado();
u1.println();
public void hasAccedido() { ... } Usuario u2 = new Usuario();
public void hasFallado() { ... } u2.hasFallado();
public void println() { ... } u2.hasFallado();
} u2.hasFallado();
u2.println();
}
}

Luis Hernández Yáñez Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 84 Curso de Java Tema 4 – Clases y objetos - 85
Carlos Cervigón Rückauer Carlos Cervigón Rückauer

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

Luis Hernández Yáñez


Curso de Java Tema 4 – Clases y objetos - 86
Carlos Cervigón Rückauer

También podría gustarte