Está en la página 1de 8

ava 2

Clases y objetos

----

Problemas resueltos
ATRIBUTOS
Ejercicio 2.1: Definir una clase que represente a un coche. En la definicin se debe incluir: el el si la el el la modelo, color, la pintura es metalizada o no, matrcula, tipo de coche, que puede ser MINI, UTILITARIO, FAMILIAR o DEPORTNO ao de fabricacin modalidad del seguro, que puede ser a terceros o a todo riesgo

Planteamiento: Al disear una clase, hay que prestar especial atencin a los atributos que se incluyen y sus tipos. Para los atributos hay que elegir nombres significativos, por ejemplo, "modelo" es un buen nombre para el atributo que representa el modelo del coche. Al elegir el tipo de un atributo, se debe pensar tanto en los valores que puede tomar, como en las operaciones que se van a aplicar. Para el modelo, el color y la matrcula, se elige el tipo Stri ng. Para determinar condiciones que se satisfacen o no, se debe elegir un boa 1 ean, como es el caso de si la pintura es metalizada o no. Cuando un atributo puede tomar una serie de valores, lo ms adecuado es utilizar un tipo enumerado, eligiendo los nombres adecuados para los diferentes valores. De esta forma, para el tipo de coche se usa un enumerado con los valores que sugiere el enunciado. Para el ao de fabricacin, se usa un nmero entero. Evidentemente, valores negativos o muy grandes podran no ser legales, pero queda a cargo del programador comprobarlo. Por ltimo, para la modalidad de seguro, de nuevo es adecuado un enumerado, con los valores { A_TERCEROS. A_TODO_RIESGO }. Solucin:

enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO }: enum TipoDeSeguro { A_TERCEROS. A TODO RIESGO }: public class Coche String modelo: String color: boolean esMetal izado: +----41 String matricula: TipoDeCoche tipo: int aoDeFabricacin: TipoDeSeguro seguro:

Los nombres de los atributos han de ser lo ms significativos posible, pero no han de ser demasiado largos.

Escoger adecuadamente los tipos de los atributos no siempre es tarea fcil.

Comentario: Se podra pensar en utilizar un valor de tipo boa 1 ean para la modalidad de seguro, por ejemplo, boolean seguroATerceros. Se usara el valor true cuando se disponga de un seguro a terceros, y fal se cuando el seguro sea a todo riesgo. En general, no es una buena decisin usar los booleanos para atributos que toman

~----

Programacin

en Java 2

dos valores. Por un lado, no queda claro el significado del valor fa 1se. Por otro, se pueden aplicar operaciones que quiz no tengan sentido. Lo peor es que compromete la extensibilidad del programa: si se necesitara otra modalidad de seguro habr que modificar muchas lneas de cdigo, mientras que aadir un valor nuevo a un enumerado es sumamente sencillo. Aviso: En este problema se ha abordado la eleccin de los atributos y sus tipos, sin tener en cuenta el tipo de acceso de los mismos; esto se tratar en posteriores ejercicios. Ejercicio 2.2: Se desea imprimir el modelo y el color de un coche dado. Para ello, se pide escribir un mtodo, que acepte un objeto de la clase Coche. Si dicha referencia no es null, el mtodo deber imprimir el modelo y el color. Si es null, el mtodo no har nada. Planteamiento: No se dice el nombre del mtodo, por lo que se elige uno significativo del problema, por ejemplo, imprimeCoche. Este mtodo acepta una referencia de la clase Coche. Se usa una sentencia if para comprobar si la referencia es nu11 o contiene un objeto, en cuyo caso se imprime el modelo y el color. Parmetros: La referencia a un objeto de la clase Coche.

Valor de retorno: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula void. Solucin: public void imprimeCoche (Coche coche) { if (coche != null) { System.out.println("El coche" .. es de color"
Para acceder al valor de los atributos, se pone el nombre del objeto, un punto y el nombre del atributo .

+ coche.modelo ++----11 +

coche.color);

Comentario: En el ejercicio siguiente se ver una forma ms conveniente de escribir mtodos que aaden comportamiento a una clase. Aviso: Es un error comn que en ejecucin se use un mtodo o atributo de una referencia que est a nu11. Esto provoca un error en tiempo de ejecucin (RunTimeError) denominado Nu11Poi nterExcept ion, que normalmente terminar la ejecucin del programa. Es una buena prctica asegurarse de que al usar una referencia, no contendr el valor especial nu11.

MTODOS
Ejercicio 2.3: Aadir a la clase Coche del Ejercicio 2.1 un mtodo de nombre imprime Coche que imprima el modelo y el color del coche. Planteamiento: Cuando se invoca un mtodo de un objeto, desde el mismo se puede acceder directamente a los atributos de la clase. Por tanto, simplemente se han de imprimir los atributos modelo Y co 1or. Parmetros: Ninguno. Al ser un mtodo de la clase Coche, no necesita ningn valor como parmetro ya que se dispone del modelo y color del coche como atributos. Valor de retorno: El mtodo no necesita devolver ningn valor de retorno por lo que se utiliza la clusula voi d.

a2
nes otra
a un

Clases y objetos
Solucin:

---{ MINI. UTILITARIO. { A_TERCEROS. FAMILIAR. DEPORTIVO }; };

enum TipoDeCoche enum TipoDeSeguro

A_TODO_RIESGO

de

class Coche { String modelo; St ring color; boolean esMetalizado; String matricula; TipoDeCoche tipo; <IIi~--------------t1 int aoDeFabricacin; TipoDeSeguro seguro; publiC void imprimeCoche () ( System.out.println("El coche" + modelo + " es de color" + color);

un l es

Elcomportamientode laclase Coche se recogeen su definicin.

Los atributos delobjetodentrode la misma clasese usan directamente, sincualificacin.

id. Comentario: Este ejercicio es similar al anterior en cuanto a funcionalidad. Sin embargo, el comportamiento de los objetos ha de recogerse siempre en la definicin de la clase y no depender de funciones externas en la medida de lo posible. Ejercicio 2.4: Escribir un programa que tenga una instancia de mi coche, que es un Rolls Royce de color dorado. El programa ha de imprimir un mensaje que diga de qu modelo y color es mi coche. Planteamiento: Los objetos han de usarse por medio de referencias. Por tanto, habr que declarar una referencia a la clase Coche. Adems, hay que elegir un nombre significativo para la referencia. Como en este caso, se guarda la informacin de mi coche, el nombre mi Coche (u otro similar) puede ser adecuado. Luego se inicializan los atributos modelo y color. Para ello, se escribe el nombre de la referencia, un punto, y el nombre del atributo, de la forma mi Coche. mode lo. Y con el operador de asignacin ("=") se le asigna el valor "Ro 11 s Royce". Lo mismo aplica al atributo color. Por ltimo, se imprimen esos valores; como la clase Coche ya dispone del mtodo imprimeCoche() (del ejercicio anterior), se puede invocar dicho mtodo de la forma

miCoche. imprimeCoche().
Solucin:

enum TipoDeCoche enum TipoDeSeguro class Coche {

{ MINI. UTILITARIO. { A_TERCEROS.

FAMILIAR. DEPORTIVO }; };

A_TODO_RIESGO

String modelo; String color; boolean esMetalizado; String matricula; TipoDeCoche tipo; int aoDeFabricacin;

Clases

y objetos

Solucin: enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO }: enum TipoDeSeguro class Coche { String modelo; String color; boolean esMetalizado; String matricula; TipoDeCoche tipo; int aoDeFabricacin; TipoDeSeguro seguro; public void imprimeCoche () { System.out.println("El coche" + modelo + " es de color" + color); { A_TERCEROS.A_TODO_RIESGO };

Elcomportamientode la clase Coche se recoge en su definicin.

Los atributosdel objetodentro de la misma clase se usan directamente, sin cualificacin.

Comentario: Este ejercicio es sirrlar al anterior en cuanto a funcionalidad. Sin embargo, el comportarrento de los objetos ha de recogerse siempre en la definicin de la clase y no depender de funciones externas en la medida de lo posible. Ejercicio 2.4: . Escribir un programa que tenga una instancia de mi coche, que es un Rolls Royce de color dorado. El programa ha de imprimir un mensaje que diga de qu modelo y color es mi coche. Planteamiento: Los objetos han de usarse por medio de referencias. Por tanto, habr que declarar una referencia a la clase Coche. Adems, hay que elegir un nombre significativo para la referencia. Como en este caso, se guarda la informacin de mi coche, el nombre mi Coche (u otro sirrlar) puede ser adecuado. Luego se inicializan los atributos modelo y color. Para ello, se escribe el nombre de la referencia, un punto, y el nombre del atributo, de la forma mi Coche. mode lo. Y con el operador de asignacin ("=") se le asigna el valor "Ro11 s Royce". Lo mismo aplica al atributo color. Por ltimo, se imprimen esos valores; como la clase Coche ya dispone del mtodo imprimeCoche() (del ejercicio anterior), se puede invocar dicho mtodo de la forma miCoche. impri meCoche(). Solucin: enum TipoDeCoche { MINI. UTILITARIO. FAMILIAR. DEPORTIVO}; enum TipoDeSeguro class Coche { String modelo; String color; boolean esMetalizado; String matricula; TipoDeCoche tipo: int aoDeFabricacin; { A_TERCEROS.A_TODO_RIESGO };

.
class

---seguro:

Programacin en Java 2

TipoDeSeguro

public void imprimeCoche () ( System.out.println("El coche" + modelo + " es de color" + color):

pruebaCoche { public static void main (String Coche miCoche= new Coche():

args[J)

mi Coche. mode10= "Ro 11s Royce": miCoche.color= "dorado": ):

mi Coche. imprimeCoche(

+----------;1

Se invoca a cierto comportamiento de los objetos de tipo Coche.

Comentario:

La salida por pantalla que produce el programa es:


Royce es de color dorado

El coche Rolls

Ejercicio 2.5: Escriba una clase que represente un Semforo, que podr estar rojo, mbar o verde. La clase tendr un atributo llamado color, inicialmente a rojo. Tambin dispondr de un atributo que determine si el semforo est parpadeando. Inicialmente, el semforo no est parpadeando. Planteamiento: Para describir el color del semforo, se usa un tipo enumerado con los tres posibles colores denominado Co 1orSemforo. Despus, se escribe la clase Semforo, que tendr dos atributos: el primero ser el color, de tipo ColorSemforo; el segundo representar si el semforo est parpadeando, para lo que se usa un boo 1ean. Solucin:
enum ColorSemforo public class { ROJO. MBAR. VERDE}: { = ColorSemforo.ROJO: = false:
""'.---oil

+------11Este enumerado representa el color


que puede tomar un semforo.

Semforo color

ColorSemforo boolean

estParpadeando

Se pueden inicializar los atributos de un objeto en la misma lnea que se declaran.

Comentario: Los atributos de los objetos pueden tomar un valor inicial en la misma lnea que se declaran. No obstante, lo normal es que cada objeto tenga valores distintos, en cuyo caso se proporcionar uno o ms constructores para el valor inicial de los atributos de un objeto, como se ver en siguientes ejercicios. Aviso: Para los atributos que especifican condiciones que se cumplen o no, es muy habitual utilizar el tipo boo 1ean. Los nombres de dichos atributos suelen ser adjetivos o, como en el ejemplo, una palabra formada por el verbo "estar" y la condicin.

Clases

y objetos

Ejercicio 2.6: Escriba un programa que instancie un semforo de la clase Semforo del ejercicio anterior. El programa escribir por pantalla el color del semforo. Luego pondr el semforo en mbar y volver a imprimir el color. Planteamiento: Se define una clase para el mtodo main ( ), que se llamar PruebaSem foro. En dicho mtodo main(), se declara un semforo, llamado 51, por ejemplo. Se instancia mediante new un objeto de la clase Semforo y se asigna a 51. Ahora se puede imprimir su color, luego se cambia a mbar y se vuelve a imprimir. Solucin: enum ColorSemforo class Semforo { ColorSemforo color = ColorSemforo.ROJO; boolean estParpadeando = false;

---~--

{ ROJO. MBAR.VERDE};

class

PruebaSemforo

{ args[]) (

public static void main (String Semforo s l : sl = new Semforo(): System.out.println("Sl

+-----------11 est"
+

Se crea el objeto semforo con la instruccin new.

sl.color);
Para poner un valor de un tipo enumerado, se escribe el nombre del tipo, un punto y el valor deseado.

sl.color = ColorSemforo.MBAR; +------11 System.out.println("Sl est" + sl.color);

Comentario: Hasta que no se genera el objeto con new, la referencia 51 contiene el valor null (inicializacin por defecto de lava). Es muy comn hacer ambas cosas en la misma lnea, como se presenta a continuacin: Semforo sI
=

new Semforo();

Aviso: La forma utilizada en la solucin para acceder a los atributos no se considera la ms adecuada. Ya se ver en otros ejercicios los mtodos accesores y los derechos de acceso. En el siguiente captulo se har hincapi en el tema. Ejercicio 2.7: Escriba un programa que disponga de una clase para representar las asignaturas de una carrera. Una asignatura tiene un nombre, un cdigo numrico y el curso en el cual se imparte. Los valores iniciales han de proporcionarse en el constructor. La clase ha de tener mtodos para obtener los valores de los atributos. El programa ha de construir un objeto con los siguientes valores: nombre "Matemticas", cdigo 1017, curso l. A continuacin, el programa ha de imprimir los valores del objeto por pantalla. Planteamiento: Se proporcionarn dos clases, una que representa a las asignaturas, llamada Asignatura, y otra para el programa, llamada Ejerci ci oAsi gnatura. La clase Asi gnatura dispondr de un constructor que acepta los valores para representar una asignatura: el nombre, el cdigo y el curso. El nombre del constructor

.0


Solucin:

~---

Programacin

en Java 2

es el mismo de la clase, Asignatura en este caso. Los atributos sern privados y se disponen de mtodos para acceder a sus valores. Normalmente, estos mtodos denominados accesores, se suelen llamar como el atributo, anteponiendo el verbo dame o get. En la clase Ejerc cioAsignatura, habr un mtodo mai n( l, en el que se crea la asignatura de matemticas de primero y luego una sentencia para imprimir sus datos.

class Asignatura private String nombre: private int cdigo: +---------11 private int curso: public Asignatura this.nombre = this.cdigo = this.curso =
Conviene que los atributos sean privados y accesibles con mtodos explcitos.

(String nombre. int cdigo. int curso) nombre: cdigo: curso:


Mtodos accesores a los atributos. Tpicamente estos mtodos se llaman

public String dameNombre(){ return nombre:

dameAtributo o getAtributo.

public int dameCdigo(){ return cdigo:

public int dameCurso(){ return curso:

class EjercicioAsignatura { public static void main(String args[]) { Asignatura a = new Asignatura ("Matemticas". 1017. 1): System.out.println("Asignatura " " cdigo" " del curso "
+ + +

a.dameNombreO + a.dameCdi go() + a.dameCurso() ):

Comentario: Se podra haber incluido el mtodo mai n( l en la clase Asignatura, con lo que con una sola clase se hubiera resuelto el ejercicio. Es muy tpico aadir un main (l a clases intermedias para probar o ejercitar la clase, aunque dicho mtodo main (l no forme parte del proyecto en el que participa la clase. Respecto de los mtodos accesores, ntese que no disponen de parmetros, lo que se indica con los parntesis vacos, como en dameNombre( l. Estos mtodos devuelven el mismo tipo que el atributo al que acceden. Aviso: La codificacin de los mtodos accesores es tremendamente trivial, lo que suscita la tentacin de elirninarlos y poner los atributos como pblicos. Se desaconseja esta prctica, pues el programador ha de responsabilizarse de una clase y no debe permitir que se modifiquen los atributos de forma arbitraria.

Clases

y objetos

Ejercicio 2.8: Definir una clase que represente un punto en un espacio bidimensional. La clase debe disponer de un constructor con las coordenadas del punto y mtodos acceso res a las coordenadas. Planteamiento: En un espacio bidimensional, un punto se representa por un par ordenado de nmeros reales. Se deben elegir nombres representativos para los mismos, como x e y. El tipo ms adecuado depender del tipo de aplicacin en que se usen estos objetos. Como el enunciado no dice nada, se usar doub1e. Para asegurar la consistencia de un objeto, es conveniente que los atributos sean privados y existan mtodos pblicos para averiguar su valor. Estos mtodos se llamarn dameXC) y dameYC), sin parmetros, y con tipo de retorno igual al del atributo que devuelven. Solucin:
public class Punto double { x , y: y) { Los atributos son privados, de forma que slo pueden modificarse mediante mtodos de la clase. Ntese el uso de thi s para resolver la ambigedad entre los nombres de los parmetros y los atributos.

----.-

private

public Punto(dou ble x, double this.x = x: this.y = y:

public

double x:

dameX(){

return

+pub 1i e doub 1e dameY( ) { return y:

--11

Los mtodos accesores proporcionan la informacin adecuada sobre el objeto.

Comentario: Fjese que se ha elegido doub 1e como tipo para las coordenadas. N o obstante, ciertas aplicaciones (por ejemplo, grficos) podran requerir i nt, o podra ser suficiente fl oat. Aviso: Se ha elegido representar el punto en coordenadas cartesianas. Se podra representar en polares, lo que supondra tener que programar las conversiones entre los diferentes sistemas de representacin. Ejercicio 2.9: Escriba un programa que instancie cuatro puntos: el primero situado en el origen, el segundo situado en (5,3), el tercero en (2, -1) Y para el cuarto como punto medio entre el segundo y el tercero. Planteamiento: Los tres primeros puntos se crean con los valores literales que nos proporciona el enunciado. Para el ltimo, se calculan sus coordenadas como las medias entre las respectivas coordenadas del segundo y tercer puntos. Solucin:
public static Punto p1
=

void main (String args[]) { new Punto (O, O): // origen (5, (2, 3): -1);

de coordenadas

Punto p2 = new Punto Punto p3 = new Punto

+-

F===============~
-11,1

1I mediante new. "==========1)

Ejemplos de creacin de objetos 11 JI