La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 1 Capítulo 7 Definindo sus propias clases Parte 2.

Presentaciones similares


Presentación del tema: "©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 1 Capítulo 7 Definindo sus propias clases Parte 2."— Transcripción de la presentación:

1 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 1 Capítulo 7 Definindo sus propias clases Parte 2

2 Objetivos –Cómo se devuelven los objetos desde métodos –El uso de la palabra reservada this –Definir métodos y contructores sobrecargados –Definir métodos y variables de clase –Cómo se pasan los argumentos a los parámetros usando el esquema pasar por valor –Documentar las clases usando javadoc –Organizar a las clases en paquetes (package)

3 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 3 Retornando un Objecto desde un Método Así como podemos devolver un valor primitivo desde un método, también se puede devolver un objeto Cuando devolvemos un objetos desde un método, en realidad lo que se devuelve es la referencia al objeto Es decir, no se retorna una copia del objeto sino la dirección del mismo

4 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 4 Clase Fraction class Fraction { private int numerator; private int denominator; public Fraction (int num, int denom) { setNumerator (num); setDenominator (num);} public int getDenominator (){ return denominator;} public int getNumerator (){ return numerator;} }

5 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 5 Clase Fraction class Fraction { private int numerator; private int denominator; // Constructor public Fraction (int num, int denom) { setNumerator (num); setDenominator (denom); } public int getDenominator (){ return denominator; } public int getNumerator (){ return numerator; } public void setDenominator (int denom){ if (denomm==0){ System.err.println(“Error fatal”); System.exit(1); } denominator = denom; } public void setNumerator (int num){ numerator = num; } Public String toString{ return getNumerator + “/” + getDenominator; } // otros métodos }

6 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 6 Ej Método que devuelve un objeto public Fraction simplificar( ) { int num = getNumberator(); int denom = getDenominator(); int gcd = gcd(num, denom); simp = new Fraction(num/gcd, denom/gcd); return simp; } El tipo de retorno indica la clase del objeto que será devuelto por el método Retorna una instancia de la clase Fraction

7 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 7 1ª Version de simplificar devuelve void public void simplificar( ) { int num = getNumberator(); int denom = getDenominator(); int gcd = gcd(num, denom); setNumerator(num/gcd); setDenominator(denom/gcd); } // Uso del Método Fraction f1 = new Fraction (24, 36); f1.simplify (); f1 cambia porque el método actualiza los valores miembros del objeto. Observar que el método se llamó para el objeto f1 ¿Es deseable cambiar el valor del objeto? en general no. Es mejor mantener la fracción f1 sin modificar y entregar otra fracción con la forma simplificada.

8 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 8 Método Simplificar retorna una fracción public Fraction simplificar( ) { Fraction simp; int num = getNumberator(); int denom = getDenominator(); int gcd = gcd(num, denom); simp = new Fraction(num/gcd, denom/gcd); return simp; } // Ej de llamada al método Fraction f1, f2; f1 = new Fraction(24, 36); f2 = f1.simplify(); System.out.println (f1.toString() + “ puede reducirse a la forma ” + f2.toString()); // Se vera 24/36 puede reducirse a la forma 2/3

9 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 9 Ej de llamada a simplificar

10 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 10 Ej de llamada a simplify (cont)

11 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 11 this La palabra reservada this se llama señalador de auto referencia porque se refiere a un objeto desde el método del objeto this puede usarse de tres formas diferentes. Vamos a verlas a continuación : Object this

12 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 12 Uso de this en el método add (sumar) llamada como  f3 = f1.add(f2) public Fraction add(Fraction frac) { int a, b, c, d; Fraction sum; a = this.getNumerator(); //el num y denom del obj b = this.getDenominator(); //que invoca al met c = frac.getNumerator(); //num y den del parám d = frac.getDenominator(); // sum = new Fraction(a*d + b*c, b*d); // observar que se crea un objeto aquí para devolver // la suma que se guardará en f3 return sum; }

13 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 13 f1.add(f2) Como f1 es el objeto receptor (estamos llamando al método desde f ) this se refiere a f1.

14 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 14 Usando add Fraction f1, f2, f3; f1 = new Fraction (1,2); f2 = new Fraction (3,4); f3 = f1.add(f2); // notar que no se crea una // instancia de f3 aqui System.out.println (“La suma de “ + f1.toString() + “ y “ + f2.toString() + “ es “ + f3.toString()); La suma de 1/2 y 3/4 es 10/8.

15 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 15 f2.add(f1) Ahora llamamos al método desde f2, entonces this se refiere a f2.

16 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 16 Usando this para referirse a miembros de datos En el ej anterior, mostramos el uso de this para llamar a un método desde un objeto receptor Podemos usar this también para referirse a un miembro de dato this.age se refiere al miembro age de esta clase class Person { int age; public void setAge(int val) { this.age = val; }... }

17 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 17 Sobrecarga de Métodos Varios Métodos pueden compartir el mismo nombre siempre que tengan distinta firma; distinto nombre, distinta cantidad de parámetros o los parámetros son de distinto tipo si tienen la misma cantidad La firma es el nombre del método y la lista de parámetros public void myMethod(int x, int y) {... } public void myMethod(int x) {... } public void myMethod(double x) {... } public void myMethod(int x) {... } Regla 1 Regla 2

18 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 18 Sobrecarga de Constructores Las mismas reglas se aplican para la sobrecarga de constructores –Así es como podemos definir más de un constructor a una clase public Person( ) {... } public Person(int age) {... } public Pet(int age) {... } public Pet(String name) {... } Regla 1 Regla 2

19 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 19 Constructores y this Para llamar a un constructor desde otro constructor de la misma clase, usamos la palabra this. public Fraction( ) { //creates 0/1 this(0. 1); } public Fraction(int number) { //creates number/1 this(number, 1); } public Fraction(Fraction frac) { //copy constructor this(frac.getNumerator(), frac.getDenominator()); } public Fraction(int num, int denom) { setNumerator(num); setDenominator(denom); }

20 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 20 Métodos de clase Usamos la palabra reservada static para definir métodos de clase public static int gcd(int m, int n) { //the code implementing the Euclidean algorithm } public static Fraction min(Fraction f1, Fraction f2) { //convert to decimals and then compare }

21 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 21 Parámetros Pasados por valor Cuando se llama a un método, –Se pasa el valor del argumento al parámetro correspondiente y –Se asigna un espacio separado de memoria para almacenar su valor Esta forma de pasar los valores de un argumento se llama pasar por valor Ya que se asigna un lugar de memoria para cada parámetro durante la ejecución del método –El parámetro es local al método y –Los cambios realizados sobre el parámetro no afectarán al argumento correspondiente

22 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 22 Ej llamada por valor class Tester { public void myMethod(int one, double two ) { one = 25; two = 35.4; } Tester tester; int x, y; tester = new Tester(); x = 10; y = 20; tester.myMethod(x, y); System.out.println(x + " " + y); produce 10 20

23 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 23 Asignación de memoria Parámetros

24 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 24 Asignación de memoria Parámetros (cont)

25 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 25 Pasando parámetros 1. Los argumentos se pasan a los métodos usando el esquema de pasaje por valor 2.Se mapean los argumentos y los parámetros en orden de izquierda a derecha. El tipo de dato de un argumento debe ser compatible con el del parámetro correspondiente 3.La cantidad de argumentos en el llamado al método debe ser igual al número de parámetros de la definición del método 4.Parámetros y argumentos no necesitan tener el mismo nombre 5.Copias locales, que son distintos de los argumentos se crean aunque argumentos y parámetros tengan el mismo nombre 6.Los parámetros ingresados a un método son locales a éste. Los cambios realizados sobre los mismos no afectan a los valores de los argumentos correspondientes

26 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 26 Met clase vs de instancia 1) Los mét de clase puden acceder sólo a variables y contantes de clase 2) Los mét de instancia, incluyendo a los constructores, pueden acceder a todo tipo de dato miembro 3) Los mét de clase no pueden llamar a mét de instancia de la misma clase 4) Los mét de instancia pueden llamar a cualquier mét de la misma clase (ya sea estático o no)

27 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 27 Organizar Clases en Paquetes (Package) Para que una clase A pueda usar otra clase B, los archivos de código byte (los *.class) deben estar en el mismo directorio. –Esto no resulta práctico cuando se quieren re usar clases programadas y distintas aplicaciones La forma para que distintas aplicaciones puedan re usar las clases es incluirlas en un paquete Un paquete es una librería de clases Java

28 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 28 Creando un Paquete Los sig pasos muestran el proceso de creación de un paquete de nombre myutil que incluye la clase Fraction 1.Incluir la sentencia package myutil; como la 1ª línea del archivo fuente de la clase Fraction 2. La declaración de la clase debe tener visibilidad public public class Fraction {... } 3. Crear una carpeta con nombre myutil, el mismo que el nombre del paquete (el paquete debe corresponderse con la carpeta) 4. Poner la clase modificada Fraction dentro de la carpeta myutil y compilarla 5. Modificar la variable de ambiente CLASSPATH para incluir la carpeta que contiene a myutil

29 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 29 Modificar la classpath Supongamos que hay una carpeta llamada progJava y que el paquete myutil se coloca dentro de esta carpeta Para poder usar este paquete hay que redefinir la variable classpath para que haga referencia a la carpeta progJava no a la de myutil set classpath=.;C:\progJava El punto se refiere a la carpeta actual

30 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 30 Usando comentarios Javadoc Muchas de las clases que diseñamos pretendemos que las puedan emplear otros programadores –Es muy importante proveerlas de la documentación para que el cliente de la clase pueda comprender como usarla correctamente. Agregando comentarios javadoc a las clases que creamos, podemos proveer de un estilo consistente de documentación de clases. Una vez que se agregan los comentarios javadoc a la clase, podemos generar arhivos HTML para documentación usando el comando javadoc

31 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 31 javadoc para Fracción Esta es una parte de la documentación HTML para la clase Fraction mostrada en un navegador. Este archivo HTML se produce procesando los comentarios javadoc del archivo fuente de la clase Fraction

32 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 32 javadoc Tags Los comentarios javadoc comienzan con /** y terminan con */ Información tal como autor, parámetros, valores de retorno y otros se indican con la marca @ @param @author @return etc

33 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 33 Ej: javadoc Fuente... /** * Returns the sum of this Fraction * and the parameter frac. The sum * returned is NOT simplified. * * @param frac the Fraction to add to this * Fraction * * @return the sum of this and frac */ public Fraction add(Fraction frac) {... }... este javadoc producirá

34 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 34 Ej: javadoc Salida

35 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 35 javadoc Fuentes Información general sobre javadoc está en: http://java.sun.com/j2se/javadoc Referencias detalladas de como usar javadoc con Windows se puede consultar en: http://java.sun.com/j2se/1.5/docs/tooldocs/windows/javadoc.html

36 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 36 Problema Escribir una aplicación que compute las cargas totales para los libros atrasados de la biblioteca. Para cada libro, el usuario ingresa la fecha de vencimiento y opcionalmente la carga por día de retrazo, la carga máxima y el título. Si no se ingresan los valores opcionales, se usan valores por defecto. Una lista completa de los libros se debe mostrar cuando el usuario termina de ingresar los libros. El usuario puede usar distintos fechas de devolución para comparar las cargas por retrazo

37 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 37 Plan General Tareas: 1.Obtener la información de todos los libros 2.Mostrar los libros ingresados 3.Preguntar la fecha de devolución y el cargo total. Repetir este paso hasta que el usuario termine

38 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 38 Clases Requiridas OverdueChecker Scanner LibraryBook helper class BookTracker

39 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 39 Pasos para el Desarrollo Desarrollaremos este programa en 5 pasos: 1. Definir la clase básica LibraryBook 2. Explorar la clase BookTracker dada e integrarla con la clase LibraryBook 3. Definir lal clase OverdueChecker, implementar las rutinas de ingreso de información. 4. Completar la clase LibraryBook implementando completamente el cálculo del recargo por atrazo. 5. Finalizar el programa

40 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 40 Paso 1 Design Desarrollar la base de la clase LibraryBook. La clave del diseño es identificar los datos miembros para almacenar la información relevante. Incluiremos múltiples constructores para facilitar la creación de los objetos LibraryBook. –Asegurese que una instancia se inicialice correctamente sin importar el constructor que se use.

41 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 41 Paso 1 Código Directory: Chapter7/Step1 Source Files: LibraryBook.java Step1Main.java (test program) Directory: Chapter7/Step1 Source Files: LibraryBook.java Step1Main.java (test program)

42 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 42 Paso 1 Prueba Probamos el programa principal Step1Main para confirmar que la salida sea la apropiada

43 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 43 Paso 2 Diseño Explorar la clase BookTracker e incorporarla al programa Adjustar la clase LibraryBook para hacerla compatible con la clase BookTracker

44 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 44 Paso 2 Código Directory: Chapter7/Step2 Source Files: LibraryBook.java Step2Main.java (test program) Directory: Chapter7/Step2 Source Files: LibraryBook.java Step2Main.java (test program)

45 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 45 Paso 2 Prueba Correr el programa principal Step2Main y verificamos que de la salida esperada.

46 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 46 Paso 3 Diseño Implementar la clase de control OverdueChecker. Maneja un objeto BookTracker y varios objetos LibraryBook Maneja las rutinas de entrada y salida Si las rutinas de ingreso y salida son complejas podemos considerar diseñar clases separadas para delegar las tareas de ingreso y salida (I/O)

47 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 47 Paso 3 Pseudocodigo GregorianCalendar returnDate; String reply, table; double totalCharge; inputBooks(); //read in all book information table = bookTracker.getList(); System.out.println(table); //try different return dates do { returnDate = read return date ; totalCharge = bookTracker.getCharge(returnDate); displayTotalCharge(totalCharge); reply = prompt the user to continue or not; } while ( reply is yes );

48 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 48 Paso 3 Código Directory: Chapter7/Step3 Source Files: OverdueChecker.java LibraryBook.java Directory: Chapter7/Step3 Source Files: OverdueChecker.java LibraryBook.java

49 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 49 Paso 3 Prueba Correr el programa intentando diferentes valores de ingreso. Confirmar que los controles de los ciclos trabajen correctamente –En este momento, el código para computar la carga atrasada esta imcompleto, así que nosotros siempre obtendremos la misma carga. Despues de verificar que todo funciona correctamente proseguimos

50 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 50 Paso 4: Calcular el recargo Para calcular el recargo necesitamos dos fechas: el día de vencimiento y el día en el que se devolvió el libro El método getTimeInMillis devuelve el intervalo de tiempo en milisegundos. Restamos los valores obtenidos para ambas fechas. –Si la diferencia es negativa, no se retrazó, por lo tanto no tiene cargo. –Si es positiva, hay que convertir a dias y multiplicar por el costo por dia para calcular el costo total por demora

51 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 51 Paso 4 Código Directory: Chapter7/Step3 Source Files: OverdueChecker.java LibraryBook.java Directory: Chapter7/Step3 Source Files: OverdueChecker.java LibraryBook.java

52 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 52 Paso 4 Prueba Corremos el programa varias veces ingresar diferentes valores de entrada para cubrir todos los casos para el calculo del cargo computeCharge. –Intentar con devolución el mismo día que el vencimiento –Se devuelve antes del vencimiento, el recargo alcanza el máximo, etc.

53 ©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 53 Paso 5: Finalizar/ Extender Revisión del Programa –Se manejan todos los casos posibles? –Las rutinas de ingreso son fáciles de usar? –Sería conveniente permitir diferentes formatos para ingresar las fechas? Posibles Extensiones –Avisarle al usuario cuando se aproxima la fecha de vencimiento –Proveer una ventana especial para ingresar los datos (Aún no vimos como implementar este tipo de técnica)


Descargar ppt "©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. 4 th Ed Chapter 7 - 1 Capítulo 7 Definindo sus propias clases Parte 2."

Presentaciones similares


Anuncios Google