Capítulo 7
Definindo sus propias clases
Parte 2
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 1
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)
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 3
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;}
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 4
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;
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
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
}
4th Ed Chapter 7 - 5
Ej Método que devuelve un objeto
El tipo de retorno indica la clase
del objeto que será devuelto por el
método
public Fraction simplificar( ) {
int num
= getNumberator();
int denom = getDenominator();
int gcd
= gcd(num, denom);
simp = new Fraction(num/gcd, denom/gcd);
}
return simp;
Retorna una instancia de la clase
Fraction
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 6
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.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 7
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 8
Ej de llamada a simplificar
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 9
Ej de llamada a simplify (cont)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 10
this
• La palabra reservada this se llama señalador de
auto referencia porque se refiere a un objeto
desde el método del objeto
: Object
this
• this puede usarse de tres formas diferentes.
Vamos a verlas a continuación
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 11
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;
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 12
f1.add(f2)
Como f1 es el
objeto receptor
(estamos
llamando al
método desde f )
this se refiere a
f1.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 13
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.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 14
f2.add(f1)
Ahora llamamos
al método desde
f2, entonces this
se refiere a f2.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 15
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;
}
. . .
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 16
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) { ... }
Regla 1
public void myMethod(double x) { ... }
public void myMethod(int x) { ... }
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
Regla 2
4th Ed Chapter 7 - 17
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) { ... }
Regla 1
public Pet(int age) { ... }
public Pet(String name) { ... }
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
Regla 2
4th Ed Chapter 7 - 18
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);
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 19
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
}
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 20
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 21
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);
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
10 20
produce
4th Ed Chapter 7 - 22
Asignación de memoria Parámetros
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 23
Asignación de memoria Parámetros
(cont)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 24
Pasando parámetros
1.
2.
3.
4.
5.
6.
Los argumentos se pasan a los métodos usando el
esquema de pasaje por valor
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
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
Parámetros y argumentos no necesitan tener el mismo
nombre
Copias locales, que son distintos de los argumentos se
crean aunque argumentos y parámetros tengan el mismo
nombre
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 25
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)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 26
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 27
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 28
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 29
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 30
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 31
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 32
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) {
...
}
. . .
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
este javadoc
producirá
4th Ed Chapter 7 - 33
Ej: javadoc Salida
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 34
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 35
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 36
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 37
Clases Requiridas
OverdueChecker
Scanner
BookTracker
LibraryBook
helper class
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 38
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 39
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.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 40
Paso 1 Código
Directory:
Chapter7/Step1
Source Files: LibraryBook.java
Step1Main.java (test program)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 41
Paso 1 Prueba
• Probamos el programa principal Step1Main para
confirmar que la salida sea la apropiada
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 42
Paso 2 Diseño
• Explorar la clase BookTracker e
incorporarla al programa
• Adjustar la clase LibraryBook para
hacerla compatible con la clase
BookTracker
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 43
Paso 2 Código
Directory:
Chapter7/Step2
Source Files: LibraryBook.java
Step2Main.java (test program)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 44
Paso 2 Prueba
• Correr el programa principal Step2Main y
verificamos que de la salida esperada.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 45
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)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 46
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 );
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 47
Paso 3 Código
Directory:
Chapter7/Step3
Source Files: OverdueChecker.java
LibraryBook.java
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 48
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 49
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
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 50
Paso 4 Código
Directory:
Chapter7/Step3
Source Files: OverdueChecker.java
LibraryBook.java
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 51
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.
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 52
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)
©The McGraw-Hill Companies, Inc. Permission
required for reproduction or display.
4th Ed Chapter 7 - 53
Descargar

Chapter 7