Objetos y clases
Amparo L´opez GaonaCiclo de vida de los objetos
En un programa se crean objetos. ´Estos interactuar´an entre s´ı, mediante el env´ıo y recepci´on de mensajes.
A trav´es de estas interacciones de objetos, se pueden tener programas que implementen interfaces gr´aficas, desplieguen una animaci´on, envien y reciban informaci´on de una red, etc.
Creaci´on de Objetos. Uso de Objetos.
Creaci´
on de objetos
Cada instrucci´on tiene tres partes:
Declaraci´on. Especifica el nombre del objeto y la clase a la que pertenece.
Barco titanic;
Creaci´on. El operador newse encarga de asignar espacio en memoria para el objeto. Tiene un operando (el nombre de la clase) y devuelve una referencia al objeto creado.
new Barco()
Inicializaci´on. El nombre de la clase y par´ametros si se requieren. titanic = new Barco();
Barco titanic = new Barco(); Punto origen = new Punto(23, 94);
Creaci´
on de objetos
Punto origen; origen new Punto(23,94) xy 2394 titanic new Punto( xy Punto origen = origen Punto origen = origenAlias de los objetos
Una referencia tiene un solo valor a la vez, pero un objeto puede tener varias referencias.
Moneda laSuertuda = new Moneda(); Moneda chiquita = laSuertuda; Moneda miMoneda = laSuertuda;
No hay creaci´on de objetos s´olo unos alias.
1
miMoneda
valor chiquita
Alias de los objetos
Una referencia tiene un solo valor a la vez, pero un objeto puede tener varias referencias.
Moneda laSuertuda = new Moneda(); Moneda chiquita = laSuertuda; Moneda miMoneda = laSuertuda; No hay creaci´on de objetos s´olo unos alias.
1
miMoneda
valor chiquita
Referencia con valor nulo
Al terminar de trabajar con un objeto se puede asignar el valor null a la referencia. laSuertuda = null; 1 miMoneda valor chiquita laSuertuda (laSuertuda = null)
En caso de que se asigne el valor null a la ´unica referencia al objeto, ´este ya no puede accesarse m´as, por tanto, queda disponible para el recolector de basura.
En resumen, el valor de una referencia puede ser el valor de otra variable (o constante) de tipo referencia, el resultado de la creaci´on de un objeto o bien el valor constante null.
Uso de objetos
Una vez creado un objeto, se puede usar quiz´a para conocer su estado, modificarlo o simplemente realizar alguna acci´on.
Para trabajar con un objeto se le deben enviar mensajes, mediante la notaci´on punto:
Sintaxis:referenciaDelObjeto.nombreDelM´etodo(param´etros)
Ejemplo: titanic.hundir();
Si se llama a un m´etodo dentro de la clase en que se defini´o, no es necesario especificar una referencia.
Es necesario conocer su signatura o firma que consta del nombre del m´etodo y entre par´entesis una lista con los par´ametros que requiere para trabajar.
Ejemplo
/*** Programa que ilustra la declaraci’on y uso de un objeto. * Usa diferentes tipos de m’etodos
* @author Amparo L’opez Gaona * @version Agosto 2008
*/
public class PruebaBarcos{
public static void main(String[] pps) {
Barco titanic; //Variable para referirse a un objeto Barco titanic = new Barco(); //Construye un nuevo objeto.
titanic.reportar(); // Pide reporte su posici’on, curso y velocidad. titanic.mover(); // Pide al barco se mueva de su posici’on actual. titanic.cambiaCurso(90); // Cambia el curso 90 grados.
double velocidadActual;
velocidadActual= titanic.reportaVelocidad(); //Reporta su velocidad }}
Eliminaci´
on de objetos in´
utiles
Java permite al programador crear todos los objetos que se deseen sin preocuparse de destruirlos.
Java elimina los objetos cuando determina que ya no ser´an usados, v´ıa un recolector de basura.
Un objeto es in´util cuando ya no hay m´as referencias a ´el: Al salir del alcance donde se defini´o.
Al asignarle valor null, o de otro objeto.
Si se desea llamar expl´ıcitamente al recolector de basura se debe llamar al m´etodo gc de la claseSystem.
Volados
Escribir un programa que juegue volados con el usuario. Debe jugar varias veces y darte un marcador final.
Sup´on que tienes las clases:
Monedaque responde al m´etodo lanzarcon ’a’ (´aguila) o ’s’ (sol). InOutcon m´etodosreadXdonde X es cualquier tipo de dato primitivo y lo que hace cada m´etodo es leer un dato del tipo especificado.
... Volados
class Volados {
static public void main (String [] pps) { InOut io = new InOut();
Moneda laSuertuda = new Moneda(); char cayo, pido;
System.out.print("Qu\’e pides (a/s)? "); pido = io.readChar(); cayo = laSuertuda.lanzar(); if (pido == cayo) io.println("Ganaste !!!"); else io.println("Perdiste !!!"); } }
... Volados
class Volados {
static public void main (String [] pps) { InOut io = new InOut();
Moneda laSuertuda = new Moneda(); char cayo, pido;
System.out.print("Qu\’e pides (a/s)? "); pido = io.readChar(); cayo = laSuertuda.lanzar(); if (pido == cayo) io.println("Ganaste !!!"); else io.println("Perdiste !!!"); } }
Creaci´
on de clases
Recordar que las clases tienen: Nombre. Identificador.
Estructura. Definida mediante la declaraci´on de datos. Comportamiento. Modelado mediante m´etodos.
Definici´
on de la clase
La clase tiene un encabezado y un cuerpo.
El encabezado incluye, entre otra informaci´on, el nombre de la clase. El cuerpo contiene atributos y m´etodos.
El encabezado consta de:
La visibilidad de la clase: p´ublica (public) o bien privada (package). La palabra reservadaclass
El nombre de la clase. Normalmente el nombre de la clase se escribe en singular.
Opcionalmente otros calificativos como extends e implements Ejemplo: Encabezado de la claseRect´anguloy los espacios para los atributos y los m´etodos.
public class Rectangulo // Encabezado
... // Atributos
... // Metodos
Definici´
on de la estructura
Componentes para cada elemento (variable de instancia): Visibilidad. Puede ser public, private oprotected. Calificador statico ninguno.
Calificador finalo ninguno. Tipo. Tipo primitivo o una clase. Nombre. Identificador.
Opcionalmente un valor inicial.
La declaraci´on de cada atributo debe terminar con un punto y coma. Ejemplo:
public class Rectangulo {
private int largo; // Estructura private int ancho;
private Punto centro;
... // Comportamiento
}
largo, ancho ycentro, s´olo son accesibles directamente desde cualquier m´etodo dentro de la clase. Encapsulaci´on.
Definici´
on de la estructura
Componentes para cada elemento (variable de instancia): Visibilidad. Puede ser public, private oprotected. Calificador statico ninguno.
Calificador finalo ninguno. Tipo. Tipo primitivo o una clase. Nombre. Identificador.
Opcionalmente un valor inicial.
La declaraci´on de cada atributo debe terminar con un punto y coma. Ejemplo:
public class Rectangulo {
private int largo; // Estructura private int ancho;
private Punto centro;
... // Comportamiento
}
Definici´
on de m´
etodos
Los componentes de un m´etodo son:
Visibilidad. Puede ser public, private oprotected. Tipo de valor que devuelve. Incluye void.
Nombre.
Lista de par´ametros. Definici´on parecida a la de atributos excepto: No puede ir precedida de tipo de visibilidad.
No terminan con ;
El paso de par´ametros es por valor.
Variable de tipo primitivo. No se modifica su valor.
Variable de referencia. No se modifica su valor pero si puede modificarse el valor del objeto referenciado.
... Definici´
on de m´
etodos
public class Rectangulo {
... // Estructura
public int obtenerLargo () { ... } // Comportamiento public int obtenerAncho () { ... }
public Punto obtenerCentro () { ... }
public void asignarLargo(int nuevoLargo) { ... } public void asignarAncho(int nuevoAncho) { ... } public void asignarCentro(Punto nuevoCentro) { ... } public double area () { ... }
public double perimetro () { ... }
public void desplazar (Punto nuevoCentro) { ... } public boolean equals (Object p) { ... }
public String toString() { ... } }
Programaci´
on de un m´
etodo
Elementos de trabajo de un m´etodo:Elementos de la estructura. Para acceder a cualquiera basta con escribir su nombre.
public int perimetro () { return largo*2 + ancho*2; }
Par´ametros. Considerados como variables locales con un valor inicial dado al momento de llamar al m´etodo.
public void asignarLargo (int l) { largo = l;
}
... Programaci´
on de un m´
etodo
Datos obtenidos como respuesta a mensajes enviados a otros objetos. (con o sin notaci´on punto).
public int distanciaAlOrigen () {
return centro.distancia(new Punto (0,0)); }
Atributos definidos como p´ublicos o est´aticos en otras clases. public void asignarLargote () {
largo = (int) Double.POSITIVE_INFINITY; }
M´
etodos modificadores
Modifican el valor de los atributos privados de los objetos.
Reciben como par´ametro el nuevo valor para el atributo, por tanto, el tipo del par´ametro y del atributo debe coincidir.
No devuelven valor alguno. /**
* Asigna valor al largo del rect’angulo
* @param nuevoLargo - nuevo valor para el largo de rect’angulo */
public void asignarLargo(int nuevoLargo) { largo = nuevoLargo;
} /**
* Asigna valor a la coordenada del centro del rect’angulo * @param nuevoCentro - nuevo valor para el centro
*/
public void asignarCentro(Punto nuevoCentro) { centro = new Punto(nuevoCentro);
} /**
* Asigna valor al ancho del rect’angulo
M´
etodos de acceso
´Unico medio de conocer el valor de los atributos privados de los objetos.
No reciben par´ametros.
Devuelven un valor del tipo definido en el atributo. /**
* Regresa el valor del largo
* @return int - largo del rect’angulo */
public int obtenerLargo () { return largo;
} /**
* Regresa el valor del ancho
* @return int - ancho del rect’angulo */
public int obtenerAncho () { return ancho;
... M´
etodos modificadores
/** Regresa el valor del centro
* @return Punto - centro del rect’angulo */
public Punto obtenerCentro () { return centro;
}
/** Permite desplazar el rect’angulo ...*/ public void desplazar (int deltaX, int deltaY) {
centro.asignarX( centro.obtenerX() + deltaX); centro.asignarY( centro.obtenerY() + deltaY); }
M´
etodos calculadores
public int perimetro () { return largo*2 + ancho*2; }
public int area () { return largo * ancho; }
public Punto puntoSupDerecho() {
int x = centro.obtenerX() + largo / 2; int y = centro.obtenerY() + ancho / 2; return new Punto(x, y);
}
public boolean esMayor (Rectangulo r) { return area() > r.area();
Constructores
Un constructor es un m´etodo cuyo objetivo se garantizar que un objeto se crea con un estado v´alido.
La instrucci´onnewes la encargada de crear el objeto y de llamar al constructor.
Un constructor se distingue de cualquier otro m´etodo en que: Tiene el mismo nombre que la clase a la que pertenece.
No tiene especificado valor de regreso, ni siquieravoid, porque no regresa ning´un valor.
Siempre se usa con la instrucci´onnew.
Es com´un que las clases tengan m´as de un constructor. Diferentes posibilidades de creaci´on de un objeto.
... Constructores
public Rectangulo (int l, int a, Punto p) { largo = l;
ancho = a;
centro = new Punto(p); }
public Rectangulo () { // Constructor por omision largo = 2;
ancho = 1;
centro = new Punto (0,0); }
public Rectangulo () { // Constructor por omision this (2, 1, new Punto(0,0));
}
public Rectangulo (Rectangulo r) { //Constructor de copia largo = r.largo;
ancho = r.ancho;
centro = new Punto(r.centro); }
El m´
etodo
equals
(Igualdad entre objetos)
public class Diferencia {
public static void main (String [] pps) {
Rectangulo r1 = new Rectangulo(100,20, new Punto(50,10)); Rectangulo r2 = new Rectangulo(20,20, new Punto (0,0)); Rectangulo r3 = new Rectangulo(100,20, new Punto(50,10)); Rectangulo r4 = r1; if (r1 == r1) { System.out.println("r1 = r1"); } if (r1 == r2) { System.out.println("r1 = r2"); } if (r1 == r3) { System.out.println("r1 = r3"); }
... El m´
etodo
equals
/**
* Determina si dos rectangulos son iguales
* @param r - rectangulo contra el cual se va a comparar * @return boolean - true si son iguales y false en otro caso */
public boolean equals (Object r) { Rectangulo rec = (Rectangulo)r;
return largo == rec.obtenerLargo() && ancho == rec.obtenerAncho() && centro == rec.obtenerCentro();
}
public boolean equals (Object r) { Rectangulo rec = (Rectangulo)r;
return largo == rec.obtenerLargo() && ancho == rec.obtenerAncho() && centro\textbf{.equals(}rec.obtenerCentro());
El m´
etodo toString
System.out.println(r1);System.out.println("Tengo el rectangulo de "+r1.obtenerLargo() + " X "+
r1.obtenerAncho()+" con centro en " + obtenerCentro()); /**
* M\’etodo para convertir un Rectangulo a cadena de caracteres * @return String -- el punto en formato de cadena
*/
public String toString() {
return "rectangulo de " + largo + " X "+ ancho +" con centro en " + centro; }
... M´
etodos
Existe un m´etodo muy importante llamadomain es donde est´a expresado el algoritmo general para resolver el problema original.
En el maines donde se crean e interact´uan los objetos involucrados en la soluci´on del problema.
Su sintaxis es la siguiente: class PruebaRectangulo{
public static void main(String [] pps) { .... //Algoritmo
} }
Java exige que el archivo donde se guarde la clase que contiene el m´etodo main se llame igual que la clase, es decir, en este caso deber´ıa estar en un archivo llamado PruebaRectangulo.java
Problema
La empresa que administra el servicio de transporte colectivo Metro ha decidido instalar m´aquinas expendedoras de boletos. Se debe desarrollar un programa que controle el funcionamiento de esta m´aquina. En el caso de los boletos del metro, cada boleto tiene un precio fijo. La m´aquina debe aceptar el dinero, imprimir los boletos requeridos, dar el cambio y llevar el control de la cantidad de dinero que tiene y de boletos que ha expedido.
Modularizaci´on. Dividir un todo en partes, las cuales pueden construirse y probarse de manera independiente y cuya interacci´on est´a bien definida. En la poo, los m´odulos son las clases.
Abstracci´on. Consiste en ignorar detalles irrelevantes y concentrarse en los detalles significativos.
... Problema
1 Encontrar los objetos principales.
Sustantivos: M´aquina para expedici´on de boletos, boleto, precio y dinero.
2 Determinar el comportamiento deseado.
M´aquina:
Aceptar la solicitud de compra. Recibir dinero. Expedir boletos. Boleto: Ser impreso. Cajero: Almacenar dinero. Contabilizar dinero.
... Problema
1 Definir escenario.
1 Dar la bienvenida al expendedor de boletos. 2 El usuario solicita boletos.
3 La m´aquina valida la cantidad de boletos. 4 La m´aquina solicita el importe de los boletos. 5 La m´aquina cobra y en su caso da cambio. 6 Si todo est´a bien, la m´aquina expide boletos.
En este escenario se aprecia la interacci´on entre los diferentes objetos involucrados en el problema.