Programación Laboratorio nº1 Dr. Eric Jeltsch F. Objetivo: Empezar a programar con Java, bajo el paradigma Orientado a Objeto. Un típico y clásico problema que bien puede ser considerado en algún curso que no necesariamente es de orientación a objeto, pero es para ir tomando confianza con la compilación, ejecución e incorporación de librerías externas en programas Java. 1) Escribir un programa que calcule la serie: ex= 1 + x/1! + x2/2!+ x3/3!+....., para un valor dado, para tal efecto, se calcularán y sumarán términos sucesivos de la serie, hasta que el último término sumado sea menor o igual que una constante de error predeterminada (por ejemplo 1e-7). Para conseguir ese objetivo, deberá construir un método que tenga el siguiente prototipo static double expo(float x); y cuya salida sea el valor aproximado de ex. Además como es costumbre, deberá testear este programa con una clase principal, la cual invoca a expo() y comprueba que para x=1 el resultado es e. Nota: Para aprender a usar clases externas, es que se pide que use en la codificación de su programa la clase Leer.java, sobre todo para el ingreso de datos. Conceptos básicos de la Programación Orientada a Objetos (POO) - Variable primitiva, no hay objetos!! class miLong{ public static void main ( String[] args ) long valor; valor = 18234; System.out.println( valor ); } } - { Variable referenciada, por ejemplo String tiene objetos!! class miString0{ public static void main ( String[] args ){ String str; str = new String( "Hola" ); System.out.println( str ); } } - Ambas situaciones (Variable primitiva y referenciada.) class miString2{ public static void main ( String[] args ){ String str; long valor; str = new String( "Hola" ); valor = 32912; System.out.println( str ); System.out.println( valor ); } } Note que: 1. Cada vez que un operador new es usado, un nuevo objeto se crea. 2. Cada vez que un objeto es creado, existe una referencia a él. __________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena Programación Laboratorio nº1 Dr. Eric Jeltsch F. 3. Ésta referencia es almacenada en una variable. 4. Después, la referencia a la variable es usada para encontrar el objeto. 5. Si otra referencia es almacenada en la variable, ella reemplaza la referencia previa. 6. Si ninguna variable referencia a un objeto, se dice que existe "garbage". La palabra "garbage" (basura) es el termino correcto usado en ciencias de la computación para referirse a objetos que no tienen referencia. - Sintaxis de la definición de una clase class Nombre_Clase { //Descripción de las variables, métodos y constructores que inicializan el //nuevo objeto. } //Una forma didáctica es separarla en tres secciones: class Nombre_Clase { // Descripción de las variables. // Descripción de los constructores. // Descripción de los métodos. } - Sintaxis de la definición de un constructor classNombre( lista_parametros ) { // Declaraciones usualmente usan las variables de la clase y los //parametros en lista_parametros. } Note que: 1.- Ningún tipo return está al frente de classNombre. 2.- No existe declaración return en el cuerpo del constructor. 3.- El constructor debe tener el mismo nombre de la clase. 4.- lista_parametros es una lista de valores y sus tipos son de acuerdo al constructor. 5.- Es correcto si la lista_parámetros es vacía. 6.- Una clase a menudo tiene varios constructores con diferentes parámetros. - Sintaxis de la definición de un método returnTipo Nombre_Metodo( Lista de parametros ) { // Java declaraciones return returnValor; } Note que: returnTipo es el tipo de valor que el método usa para llamar al método. Su método puede return valores. Por ejemplo, length() de la clase String returns un tipo int. return es usado por el método para devolver un valor a su llamada. Si Ud. desea un método que no devuelva valor a su llamada, use el tipo de return void. El return puede ser omitido; pues el método automáticamente devolverá un valor tras su ejecución. __________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena Programación Laboratorio nº1 Dr. Eric Jeltsch F. Ejemplo Básico //definición de la clase class HolaObjeto { // definición del método void saludo() { System.out.println("Hola desde un objeto!"); } } //clase testeadora class HolaTest { public static void main ( String[] args ) HolaObjeto miObjeto = new HolaObjeto(); miObjeto.saludo(); } } - { Características de la Clase -public, es un modificador que contiene la clase y que permite que el objeto así definido pueda ser accedido por métodos de cualquier clase. -abstract, define un método o clase abstracta. -final, especifica que una clase no podrá tener herederos (es decir no puede tener subclases), ó en términos de variable será solo una constante, o en términos de método que no podrá ser reemplazado. - Atributos de la clase (public, protected, private, static, final, transient, volatile) -public , es un atributo que es visible para toda otra clase. Ahora tal vez es posible entender por qué main() siempre está precedido por el especificador public, ya que es llamado por código que está fuera del programa, es decir por el interprete de Java. -protected , este atributo es visible inclusive para clases que heredan de la actual, así como clases del mismo paquete. -private, este atributo es solamente visible al interior de la clase declarada. -static, la validez de este atributo es en toda la clase, es decir todo objeto de esa clase comparte los mismos atributos. -final, este atributo se refiere a una constante, y puede según su inicialización no ser cambiada. -volatile, especifica que el valor de una variable puede cambiar de forma asíncronica, por lo que el compilador no debe intentar optimarla. 2) La POO sugiere separar las implementaciones en archivos .class, fundamentalmente para reutilizar y mantener dichas clases, bajo este requerimiento se pide: Diseñar una clase que se llame miFecha, que debe almacenar una fecha, (día: entre 1 y (29, 30 o 31), mes entre (1 y 12), y año sea mayor, o igual que 1582. Parece lógico pensar que la estructura de dato de un objeto fecha va a estar formada por los atributos día, mes y año, (para implementar la clase use la clase Leer.java). __________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena Programación Laboratorio nº1 Dr. Eric Jeltsch F. Por otra parte, las operaciones sobre estos objetos tendrán que permitir asignar una fecha, de manera que debería contener esta clase un método1, asignarFecha(), (este método debería tener la clase GregorianCalendar para obtener una fecha de un objeto existente) en método2, obtenerFecha(), y verificar si la fecha que se quiere asignar es correcta, que debería hacerlo otro método3, llamado fechaCorrecta(). Estos tres métodos formarán la interfaz pública. Por otra parte, si el día corresponde a Febrero, el método fechaCorrecta() necesitará comprobar si el año es "bisiesto", para lo cual deberá añadir un método bisiesto(). Ya que un usuario NO necesita acceder a este método, declárelo protegido, con la intención de que en el futuro, sí pueda ser accedido desde una subclase. Con todos estos datos, está en condiciones de implementar la clase miFecha. Resumiendo, la funcionalidad de esta clase está soportada por los atributos privado día, mes y año, y por los métodos asignarFecha(), obtenerFecha(), fechaCorrecta() y bisiesto(). Para concluir falta construir una clase principal que testee la clase miFecha. Para tal efecto, escribir una aplicación TestearFecha que usa la clase miFecha. Recordar que cada vez que se entregue una fecha el programa deberá verificar si ella es correcta, de otra manera, continua hasta que satisfaga los rangos que deben ser anunciados a los usuarios. Por último no olvidar la robustez y la optimización de códigos, fundamentales en un buen programador. Una visualización del resultado se puede apreciar en la figura siguiente. Actividad 3: __________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena