Universidad Carlos III de Madrid

Ingeniería de Telecomunicación

Enero-Mayo 2010 / January-May 2010

Orientación a Objetos y Herencia

Lab Section1. Sesión 2 (laboratorio): Orientación a Objetos y Herencia (I)

Exercise Section1.1. Puntos y Figuras Geométricas (I)

La clase Punto.

Un punto en el plano se puede representar mediante un par de coordenadas x e y, ambas tomando valores en el conjunto de los números reales. En Java podemos representar un punto en el plano mediante una instancia de la siguiente clase:

public class Punto {
    private double x;
    private double y;

    /* métodos */
    /* a completar en el resto de apartados */
}
Constructor de la clase.

En Java, el constructor de la clases sirve para inicializar los valores de los atributos a la hora de instanciarse un objeto de la misma en tiempo de ejecución.

  1. Programa un constructor para la clase Punto. Debe recibir como parámetros las dos coordenadas del punto.

Método para representar un objeto en formato de texto.

El método toString() tiene un significado especial en los objetos Java. Es el método que se utiliza para obtener una representación como cadena de texto de dicho objeto.

  1. Programa el método toString() para que devuelva una cadena de texto con la representación del punto con el siguiente formato:

    (x, y)

    donde x e y deben ser reemplazados por sus respectivos valores. El prototipo de dicha función se especifica a continuación:

    public String toString() {
        /* ... */
    }

    Pista

    Recuerda que el operador "+", aplicado a cadenas de texto, permite concatenarlas. Si se concatenan números a cadenas, Java los convierte automáticamente a cadenas de texto para realizar la concatenación.

El método main.

Ahora debes crear clase para probar el código anterior.

  1. Programa una clase llamada Prueba que tenga un método main. Este método debe recibir como argumentos de línea de comandos las coordenadas x e y, crear un nuevo objeto Punto con dichas coordenadas e imprimir en su salida estándar (la pantalla en este caso) la representación textual de dicho objeto.

    El programa debe comprobar que el número de argumentos de línea de comandos recibido sea el correcto.

    Pista

    El método parseDouble de la clase Double (consulta su API pinchando en el enlace) transforma una cadena de texto a un tipo primitivo double.

Los métodos de acceso.

Es habitual que los atributos de un objeto se declaren como privados (private) para evitar accesos incontrolados desde otros puntos del código. Si es necesario que desde el exterior se acceda a estos atributos, se proporcionan métodos cuyo nombre empieza, por convenio, con las cadenas "get" (acceso en lectura) y "set" (acceso en escritura).

  1. Programa en la clase Punto los siguientes métodos, que devuelven el valor de las coordenadas x e y. El prototipo de dichos métodos se muestra a continuación:

    public double getX() {
        /* ... */
    }
    
    public double getY() {
        /* ... */
    }
  2. Modifica el código de tu clase Prueba para comprobar que su comportamiento es correcto.

Cálculo de distancias.

En este apartado vamos a implementar dos métodos auxiliares que nos permitirán calcular distancias entre puntos.

  1. Programa un método de la clase Punto que devuelva la distancia del punto al origen de coordenadas. El prototipo del método se muestra a continuación:

    public double distanciaAlOrigen() {
    /*  completar */
    }

    Modifica el código de tu clase Prueba para comprobar que su comportamiento es correcto.

  2. Programa un método en Punto que devuelva la distancia entre el punto representado por la instancia actual del objeto y otra instancia de Punto que se recibe como parámetro. El prototipo del método se muestra a continuación:

    public double calcularDistancia(Punto otroPunto) {
        /* completar */
    }

    Modifica el código de tu clase Prueba para comprobar que su comportamiento es correcto.

Cálculo de cuadrante.
  1. Programa un método de la clase Punto que devuelva el cuadrante en el que se encuentra el punto.El prototipo del método se muestra a continuación:

    • Devuelve 0 si está en el origen de coordenadas o sobre alguno de los ejes.

    • Devuelve 1 si está en el primer cuadrante (x e y positivos).

    • Devuelve 2 si está en el segundo cuadrante (x negativo e y positivo).

    • Devuelve 3 si está en el tercer cuadrante (x e y negativos).

    • Devuelve 4 si está en el cuarto cuadrante (x positivo e y negativo).

    El prototipo del método se muestra a continuación:

    public int calcularCuadrante() {
      /* completar */
    }

    Modifica el código de tu clase de prueba para comprobar que su comportamiento es correcto.

Cálculo del punto más cercano.

En este apartado tienes que basarte en los métodos de los apartados anteriores.

  1. Programa un método en Punto que reciba como parámetro un array de objetos de la clase Punto y devuelva una referencia al objeto de dicho array que esté más cercano al punto actual.El prototipo del método se muestra a continuación:

    public Punto calcularMasCercano(Punto[] otrosPuntos) {
      /* completar */
    }

    Modifica el código de tu clase Prueba para comprobar que su comportamiento es correcto.

La clase Triangulo.

Un triángulo está plenamente definido por sus tres vértices. Estos vértices se pueden representar como objetos de la clase Punto.

Declaración de la clase.

En este apartado tienes que basarte en los métodos de los apartados anteriores.

  1. Programa la clase Triangulo con sus atributos y un constructor que reciba como parámetro tres puntos del plano.

Longitud de los lados.

Programa una clase para probarlo.

  1. Programa el método calcularLongitudLados() de la clase Triangulo, que debe devolver un array de tres posiciones, cada una de las cuales debe ser la longitud de uno de los lados del triángulo. El prototipo del método se muestra a continuación:

    public double[] calcularLongitudLados() {
        /* completar... */
    }

Homework Section2. Actividades para casa

Exercise Section2.1. Ejercicio para practicar con Fechas

En este ejercicio, vamos a crear una clase Fecha que nos permita trabajar con fechas. La clase debe almacenar una serie de atributos y debe definir una serie de métodos para realizar distintas operaciones básicas.

Antes de escribir código, piensa cuidadosamente el diseño de la clase Fecha.

  1. ¿Qué información debe almacenar cada objeto? Si un mismo dato puede almacenarse en distintos formatos, ¿usarías varios atributos para representar la misma información? ¿Por qué? ¿Qué formato crees que es más conveniente?

  2. ¿Qué constructores proporcionarías? Observa que los constructores tendrán que inicializar los datos internos del objeto.

  3. Piensa qué métodos crees que sería útil incluir.

  4. ¿Se te ocurre alguna información que sería conveniente incluir en la clase, común para todos los objetos Fecha?

Atributos de la clase

  1. Define los atributos de la clase Fecha.

Constructores de la clase.

La clase Fecha debe proporcionar dos constructores que inicialicen objetos de tipo Fecha:

  • Un constructor con tres enteros que indican el día, mes y año respectivamente.

  • Un constructor con tres cadenas de caracteres, que indican el día, el mes y el año.

  1. Programar dichos constructores, de acuerdo a las siguentes declaraciones:

    public Fecha(int dia, int mes, int año) {
        /* completar */
    }
    
    public Fecha(String dia, String mes, String año) {
        /* completar */
    }
    

Métodos de acceso de los atributos de la clase.

Los atributos del objeto conviene que se declaren de acceso privado para evitar errores en su modificación. Programa los métodos get y set necesarios para leer y modificar la información encapsulada en los objetos Fecha.

Método toString() de representación del objeto.

El método toString() tiene un significado especial en los objetos Java. Es el método que se utiliza para obtener una representación como cadena de texto de dicho objeto mostrando los valores de los atributos en un instante determinado.

  1. Programa el método toString() que tiene la siguiente declaración:

    public String toString() {
        /* completar */
    }
    

    Este método tiene que devolver una cadena de texto con la representación de una fecha, según el siguiente formato:

    día(Numero) de mes(Texto) de año(Numero)

    EJEMPLO : 6 de Agosto de 2007

Método compareTo() para comparar fechas.

El método compareTo() tiene un significado especial en los objetos Java. Es el método que se utiliza para comparar dos objetos.

LECTURA RECOMENDADA: Consulta el API del interfaz Comparable para comprobar qué valor debe devolver en los distintos casos: según si el objeto con el que comparamos el objeto actual es mayor, menor o igual que éste.

  1. Programa el método compareTo() que tiene la siguiente declaración:

    public int compareTo(Fecha fecha) {
        /* ... */
    }
    

    El método compara la fecha almacenada en el objeto con la que se le pasa como parámetro, devolviendo como resultado:

    • -1 si la fecha contenida en el objeto actual es anterior a la que se pasa por parámetro.

    • 0 si son iguales.

    • 1 si la fecha contenida en el objeto actual es posterior a la que se pasa por parámetro.

Método auxiliar sobrecargado.

Recuerda que en una clase pueden aparecer varios métodos con el mismo nombre, siempre que tengan distintos parámetros de entrada. A esto se le denomina sobrecarga de métodos (en inglés, overload).

  1. Programa un método auxiliar que devuelve el número de días que tiene el mes que se le pasa como parámetro. Sobrecarga el método de modo que pueda utilizarse el número o el nombre del mes. Los métodos tienen las siguientes declaraciones:

    ... int getDiasMes(int mes) {
        /* completar */
    }
    
    ... int getDiasMes(String mes) {
        /* completar */
    }
    

Exercise Section2.2. Orientación a objetos, paso a paso

Clases y Creación de Objetos

Objetivo

Practicar la declaración de clases y la creación de objetos.

Ejercicio

La clase Album va a representar la producción musical de un determinado cantante o grupo, que se caracteriza por los siguientes atributos:

  • title: El título del Album

  • author: El nombre del cantante o grupo

  • year: Año de publicación

  • elements: Número de cds o DVDs que incluye el Album

  • price: Precio recomendado de venta al público, sin incluir IVA

  • genre: Un caracter indicando el tipo de música (D: Dance, P: Pop, R: Rock, C: Classical, J: Jazz, O: Other)

  • isSpanish: True si el álbum es de un cantante español

Razona de qué tipo sería cada uno de los atributos y los modificadores de acceso. Luego escribe la clase Album en Java

Ahora programa una clase llamada AlbumTest, que únicamente contenga un método main y sirva para probar cómo funciona la clase Album. La clase de prueba debe realizar lo siguiente:

  • Crear dos objetos de tipo Album llamados album1 y album2

  • Dar valor a los atributos de ambos objetos con los datos de dos álbumes que te gusten

  • Imprimir los datos de cada álbum correctamente tabulados, como se presentan a continuación

               	Album:
    		Titulo:		Crazy Hits
    		Autor:		Crazy Frog
    		Año:		2005
    		Num:		1
    		Precio:		14.99
    		Género:		D
    		Español:	False
             

Métodos de acceso

Objetivo

Practicar la encapsulación de objetos y el acceso mediante métodos públicos a atributos privados.

Ejercicio

Añade al programa métodos para rellenar y leer todos los campos de la clase. En el caso del atributo genre antes de asignar valor al atributo, comprueba que el caracter utilizado es un caracter válido.

Modifica el main de la clase AlbumTest para que utilice los metodos de acceso definidos. Comprueba que imprime el resultado correcto.

Operadores

Objetivo

Practicar el uso de operadores aritméticos.

Ejercicio

Modifica AlbumTest.java para que calcule el precio total de los dos álbumes e imprima un mensaje en pantalla como este:

	  Precio total (sin IVA):	29.98 euros
	  Precio total (con 16% IVA):	34.7768 euros
	

Constructores

Objetivo

Practicar el uso de constructores y su relación con los métodos de acceso.

Ejercicio

Hasta ahora no hemos escrito ningún constructor para la clase Album. Después de crear un objeto usando el constructor por defecto se llama a los métodos de acceso setTitle o setAuthor para dar valor a los atributos del objeto creado. Esto tiene el inconveniente de que si nos olvidamos de rellenar algún atributo pueden quedar objetos Album con valores inconsistentes. Para solucionarlo, escribe un constructor para la clase Album que de valor a todos los atributos del objeto. Para hacerlo debes pasarle al constructor una lista de parámetros para rellenar todos los atributos del objeto. Esto nos permitirá llamar al constructor de la siguiente forma para crear un objeto:

	new Album("Crazy Hits","Crazy Frog",2005,1,14.99,'D',false);
	

Constantes

Objetivo

Practicar el uso de las constantes y de la sentencia de selección switch.

Ejercicio

Crea una constante para identificar cada uno de los distintos generos musicales y asígnales el valor indicando en el enunciado por ejemplo ROCK='R'. Modifica el método setGenre para que utilice estas constantes para realizar las comprobaciones necesarias y asignar valor al atributo genre

Tipos de referencia

Objetivo

Practicar el uso de las clases como tipos de referencia en la declaración de atributos

Ejercicio

El precio de un álbum es algo que puede cambiar en el tiempo dependiendo de nuestras políticas de precios, ofertas de temporada, etc. vamos a cambiar el atributo price para gestionar mejor estos cambios. En lugar de utilizar un tipo basico (double) para representarlo vamos a crear un tipo específico de datos que llamaremos Rate (tarifa). De este modo podemos declarar una clase Rate y encapsular en ella un conjunto de datos y comportamientos específicos que nos permitirán calcular dicho precio.

Crea una clase Rate que contenga la siguiente información:

  • 3 constantes numéricas para los diferentes tipos de tarifa (NORMAL=0, REDUCED=1, INCREASED=2)

  • Un atributo llamado base para representar el precio sin ofertas ni recargos

  • Un atributo plus que indica la cantidad que hay que sumar o restar al precio básico dependiendo de que se trate de una tarifa aumentada o reducida

  • Un método getPrice que calcule el precio según la siguiente fórmula y devuelva su val:

    • Precio normal = base*num

    • Precio rebajado (ejemplo oferta de temporada) = base*num*(1-plus)

    • Precio aumentado (ejemplo edición especial) = base*num*(1+plus)