Resumen Programación Basada en Objetos

Anuncio
Resumen Programación Basada en Objetos
Referencia this
Todo objeto puede hacer referencia a si mismo, mediante la palabra clave this. P a r a i l u s t r a r
e l u s o d e l a r e f e r e n c i a t h i s u s a r e m o s l a c l a s e F r a c c i o n , la cual contiene como
campos de datos, dos valores int (num y den) correspondientes al numerador y denominador de
una fracción matemática.
ƒ
Diferenciar un campo de la clase de una variable local dentro de un método
public class Fraccion {
private int num, den;
// constructor con parámetros
public Fraccion(int num, int den){
this.num = num;
this.den = den;
}
}
El constructor recibe como parámetros dos variables llamadas num y den. Si un método contiene
una variable local con el mismo nombre que un campo de esa clase, la variable local oculta al
campo en el alcance de ese método, es decir, el método se referirá a la variable local, en lugar del
campo de la clase. Para indicar cual es la variable de la clase se coloca this. precediendo al
nombre del campo, similar a colocar una referencia a un objeto para acceder a uno de sus
campos. En este caso this es la referencia al objeto mismo.
ƒ
Retornar la referencia a si mismo
Creación de un objeto Fraccion
/* método que simplifica un objeto
Fraccion f = new Fraccion(12, 24);
Fraccion y retorna la referencia a si
f
num
den
12
24
mismo */
public Fraccion simplificar(){
int dividir = mcd();
num /= dividir;
den /= dividir;
return this;
}
La llamada al método simplificar:
Fraccion f1 = f.simplificar();
simplifica los valores de num y den del objeto f, y
retorna la referencia al objeto f (this); esta referencia
se asigna a f1, de modo que f y f1 son referencias al
mismo objeto.
f
f1
num
den
1
2
Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2006.
Programación Basada en Objetos
2
Objetos como parámetros de métodos
Cuando se hace una llamada a un método de un objeto, implícitamente en la llamada, además de
los parámetros que se pasan explícitamente, Java pasa implícitamente la referencia this del
objeto.
Ejemplo
Método sumar de la clase Fraccion
public Fraccion sumar(Fraccion obj){
Fraccion s = new Fraccion();
s.num = this.num*obj.den + this.den*obj.num;
s.den = this.den*obj.den;
return s;
}
LLamada al método sumar de Fraccion
Fraccion f = new Fraccion(1, 2);
Fraccion f1 = new Fraccion(2, 4);
Fraccion suma = f.sumar(f1);
En la llamada a sumar, se pasa explícitamente la referencia al objeto f1 e implícitamente se pasa
la referencia al objeto f (this), de modo que el método pueda referenciar tanto los campos del
objeto que recibe como parámetro, como los campos del objeto al cual se le está haciendo la
llamada.
En el cuerpo del método sumar, las variables num y den precedidas por la referencia this, se
refieren a num y den del objeto f y las variables num y den precedidas por obj se refieren a num y
den del objeto f2. El uso de this en el método sumar es opcional, en vista de que dentro del
método no existen variables locales de igual nombre a los campos de la clase.
Métodos que retornan referencias a objetos
En un método, para retornar la referencia a un objeto simplemente colocamos return y a
continuación la referencia al objeto.
Ejemplo 1
public Fraccion dividir(Fraccion obj){
return new Fraccion(num*obj.den, den*obj.num);
}
El método dividir crea un objeto con el operador new y retorna la referencia al objeto creado.
Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2006.
3
Programación Basada en Objetos
Ejemplo 2
public Fraccion sumar(Fraccion obj){
Fraccion s = new Fraccion();
s.num = num*obj.den + den*obj.num;
s.den = den*obj.den;
return s;
}
El método sumar crea un objeto Fraccion llamado s para almacenar el resultado de sumar un
objeto Fraccion (this) con otro objeto Fraccion obj que recibe como parámetro y retorna la
referencia al objeto s.
LLamadas al método sumar
Ejemplo 2.a
f
Fraccion f = new Fraccion(2,4);
Fraccion f2 = new Fraccion(1,2);
Fraccion suma = f.sumar(f2);
num
den
2
4
1
2
f2
suma
8
8
La referencia al objeto s se asigna a la variable suma, ahora suma referencia al objeto s creado en el
método sumar.
Ejemplo 2.b
Fraccion suma =
new Fraccion(2,4).sumar(new Fraccion(1,2));
En este ejemplo no tenemos acceso a las referencias de los dos objetos Fraccion que se están
sumando, únicamente tenemos acceso a la referencia del objeto resultante de la suma en la
variable suma.
Obsérvese la sintaxis:
Referencia_a_objeto.Llamada_a_método_de_objeto (Referencia_a_objeto);
recuérdese que new retorna la referencia al objeto creado.
A continuación se muestra la clase Fraccion:
Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2006.
4
Programación Basada en Objetos
/*
* Fraccion.java
* Created on 20 de abril de 2006, 09:55 AM
* autor
M. Fátima De Abreu
*/
package CompAvanz12006.Unidad1.pbo;
// Referencia
//http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/estatico/fraccion/frac
cion.htm
public class Fraccion {
private int num, den;
// Constructores
public Fraccion() {
num = 0;
den = 1;
}
public Fraccion(int num, int den){
this.num = num;
this.den = den;
}
public Fraccion(Fraccion obj){
num = obj.num;
den = obj.den;
}
// métodos set y get
public void setNum(int n){
num = n;
}
public void setDen(int n){
den = n;
}
public int getNum(){
return num;
}
public int getDen(){
return den;
}
Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2006.
Programación Basada en Objetos
public String toString(){
return num + "/"+den;
}
public boolean equals(Fraccion obj){
return (obj.num == num) && (obj.den == den);
}
public Fraccion sumar(Fraccion obj){
Fraccion s = new Fraccion();
s.num = num*obj.den + den*obj.num;
s.den = den*obj.den;
return s;
}
public Fraccion restar(Fraccion obj){
Fraccion r = new Fraccion();
r.num = num*obj.den - den*obj.num;
r.den = den*obj.den;
return r;
}
public Fraccion multiplicar(Fraccion obj){
Fraccion m = new Fraccion();
m.num = num*obj.num;
m.den = den*obj.den;
return m;
}
public Fraccion dividir(Fraccion obj){
return new Fraccion(num*obj.den, den*obj.num);
}
/** mcd, determina el máximo común divisor del numerador y del denominador.
* Para ello emplea el algoritmo de Euclides
*/
Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2006.
5
Programación Basada en Objetos
6
private int mcd(){
int u = Math.abs(num);
int v = Math.abs(den);
if (v == 0){
return u;
}
int r;
while(v!=0){
r = u%v;
u = v;
v = r;
}
return u;
}
public Fraccion simplificar(){
int dividir = mcd();
num /= dividir;
den /= dividir;
return this;
}
}
A continuación se muestra la clase utilizada para probar los métodos de la clase Fraccion, la
llamaremos
PruebaFraccion:
/*
* PruebaFraccion.java
* Created on 20 de abril de 2006, 10:18 AM
* autor
M. Fátima De Abreu
*/
package CompAvanz12006.Unidad1.pbo;
public class PruebaFraccion {
public static void main(String[] args) {
System.out.println("Crea dos fracciones\n");
Fraccion f1 = new Fraccion();
Fraccion f2 = new Fraccion(10,2);
Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2006.
7
Programación Basada en Objetos
System.out.println("f1= " + f1 + "\nf2= " + f2);
System.out.println("\nmodifica f1 como la inversa de f2\n");
f1.setNum(f2.getDen());
f1.setDen(f2.getNum());
System.out.println("f1= " + f1 + "\nf2= " + f2);
System.out.println("\nf3 es un clon de f2 f2\n");
Fraccion f3 = new Fraccion(f2);
System.out.println("f3= " + f3 + "\nf2= " + f2);
System.out.println("\nVerifica que f2 y f3 son iguales\n");
System.out.println("f3 == f2? "+ f3.equals(f2));
System.out.println("\nVerifica que f1 y f3 son diferentes\n");
System.out.println("f1 == f3? "+ f1.equals(f3));
System.out.println("\nsuma f1 con f2\n");
System.out.println("f1 + f2 =
"+ f1.sumar(f2));
Fraccion suma_f1f2f3 = f1.sumar(f2).sumar(f3);
System.out.println("\nsuma f1 con f2 y f3\n");
System.out.println("f1 + f2 + f3 =
"+ suma_f1f2f3);
System.out.println("\nsimplifica suma_f1f2f3\n");
System.out.println("f1 + f2 + f3 =
"+ suma_f1f2f3.simplificar());
}
}
Universidad de Carabobo. Facultad de Ingeniería. Departamento de Computación. Computación Avanzada. 1-2006.
Descargar