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.