Se desea definir una clase Punto que implementa las siguientes operaciones:
Observación: cuando System.out.println recibe como argumento el objeto p, entonces invoca p.toString() y despliega el string retornado por este método.Punto p= new Punto(3, 4); System.out.println(p); // (3,4) p.moverEn(1, 2); System.out.println(p); // (11,12)
Ejercicio:
Para definir una clase se usa:
public class Nombre {
// Definiciones
Constructores
Variables de instancia de objetos
Métodos
Variables estáticas (compartidas)
Métodos estáticos
}
La clase debe estar definida en un archivo Punto.java con contenido:
public class Punto {
int x, y; // Variables de instancia
public Punto(int x, int y) { // El constructor
this.x= x; this.y= y;
}
public void moverEn(int dx, int dy) { // Un método
this.x+= dx; this.y+= dy;
}
public String toString() { // Otro método
return "("+this.x+","+this.y+")";
}
}

o.v
o.v = expresión;
this.x= this.x + 1;
Ejercicio: definir el método moverA.
Fíjese en la definición del método moverEn(...).Punto p= new Punto(10,10); p.moverA(5,5); System.out.println(p); // Debe mostrar: (5,5)
Ejemplo: Se desea agregar un método a la clase Punto que calcule la distancia entre este punto y un segundo punto recibido como argumento:
Punto p= new Punto(100, 100); Punto q= new Punto(103, 104); System.out.println( p.distanciaA(q) ); // 5 System.out.println( q.distanciaA(p) ); // 5 System.out.println( p.distanciaA(p) ); // ?
Solución:
public class Punto {
...
public double distanciaA(Punto punto) {
int dx= punto.x - this.x;
int dy= punto.y - this.y;
return Math.sqrt(dx*dx+dy*dy);
}
}
Un objeto puede referenciar variables de otra instancia del mismo
objeto.
Un método también puede invocar otros métodos y retornar objetos.
Ejemplo: un método que recibe 2 puntos y entrega aquel que esté más lejos de este punto.
public class Punto {
...
public Punto masLejano(Punto p, Punto q) {
if (this.distanciaA(p) >= this.distanciaA(q))
return p;
else
return q;
}
}
Ejemplo de uso:
Obs: el objeto de la invocación del método masLejano es referenciado por la variable p.Punto p= new Punto(100, 100); Punto r= p.masLejano(new Punto(101,101), new Punto(1,1)); System.out.println(r); // (1,1)
En la definición del método masLejano este objeto es referenciado por otro identificador. ¿Cuál?
Ejercicio: agregue el método suma a la clase Punto. El método debe sumar este punto con un segundo punto recibido como argumento y entregar el resultado en un nuevo punto.
Punto p= new Punto(10, 100); Punto q= new Punto(20, 100); Punto r= p.suma(q); System.out.println(r); // (30,200) // Cuidado! los puntos p y q no deben ser alterados System.out.println(p); // (10,100) System.out.println(q); // (20,100)
Resuelva este problema de la siguiente forma:
public class Punto {
...
// El método recibe un punto como argumento y
// entrega como resultado un nuevo punto:
public Punto suma(Punto p) {
Obtenga las coordenadas de este punto con
this.x y this.y
Obtenga las coordenadas de p con
p.x y p.y
Sume coordenada a coordenada estos valores
y construya un nuevo punto con el resultado
(usando new)
Retorne el resultado al invocador mediante
return el nuevo punto;
}
}
java PruSuma
Las variables de instancia se pueden accesar sin pasar por this (si no hay ambiguedad con variables locales). La clase Punto se puede reescribir:
public class Punto {
int x, y; // Variables de instancia
public Punto(int x, int y) { // El constructor
this.x= x; this.y= y; // no se puede suprimir this
}
public void moverEn(int dx, int dy) { // Un método
// this.x += dx; this.y += dy;
x += dx; y += dy;
}
public String toString() { // Otro método
// return "("+ this.x +","+ this.y +")";
return "("+ x +","+ y +")";
}
...
}
De la misma forma, se pueden invocar otros métodos del mismo objeto sin pasar por this. El método masLejano se puede reescribir:
public class Punto {
...
public Punto masLejano(Punto p, Punto q) {
// if (this.distanciaA(p) >= this.distanciaA(q))
if (distanciaA(p) >= distanciaA(q))
return p;
else
return q;
}
}
public void moverA(Punto dest) { ... }
public void moverA(int x, int y) { ... }
Al invocar un método, el compilador busca en la clase el método que corresponda a los argumentos de la invocación.
Punto p= new Punto(10,10);
Punto q= new Punto(100,100);
p.moverA(q); // busca moverA(Punto)
p.moverA(0,0); // busca moverA(int,int)
p.moverA("la esquina"); // Error en compilación