sábado, 14 de julio de 2012

2.3.2. Tipo de Métodos


Identificadores de Acceso de un Método
De acuerdo a la manera de acceder a un método, éste puede ser declarado como :
public. Cualquier objeto de otra clase puede utilizar el método sobre un objeto de esta clase.
Ejemplos:
          g.drawString(" Hola ", 100, 100);
         t.setText("");
        p.paint(g);
private. Solo un elemento de la clase lo puede utilizar al método, ningún objeto de otra clase puede utilizar este método.
protected. Solo elementos de la clase o los descendientes (por herencia) pueden utilizar este método, este método lo usaremos mucho cuando veamos herencia.
static. La mejor manera de acceder al método static es a través de utilizar la clase, ya que este método pertenece a la clase y no se liga como comportamiento de algún objeto de la clase, sino con el comportamiento de la clase en sí. Un ejemplo del uso de este método es el Integer.parseInt( t.getText() );  que hemos usado anteriormente, el método parseInt es declarado como static dentro de la clase Integer, pues su servicio no esta supeditado a un objeto, esta clausula static puede ir combinada con public o private o protected.
A continuación utilizaremos la clase Cuenta que representará una cuenta bancaria, dicha clase manejará una sola variable de instancia que se referirá al saldo y entonces tendremos la siguiente clase:
public class Cuenta {
   private double saldo; // variable para manejar el saldo
   public Cuenta() { // método para construir una cuenta vacía
      saldo = 0.0;
   }

   // método para construir una cuenta con un saldo inicial
public Cuenta(double saldo) {
      this.saldo = saldo;
   }

   // método que te dá el saldo de una cuenta
public double obtenSaldo() {
      return x;
   }

   // método que sirve para cambiar el valor del saldo
public void cambiaSaldo(double saldo) {
   // this se utiliza porque se esta utilizando (saldo) como parámetro y como 
this.saldo = saldo;
// variable de instancia y esto es para que no se confunda
   }
}
En esta clase estamos utilizando todos los métodos como públicos, ya que nos interesaría que desde cualquier applet se pudieran crear objetos de la clase Cuenta, simplemente definiendo algun objeto y creandolo con algúno de los constructores, por ejemplo:
       Cuenta juan = new Cuenta();
      Cuenta pedro = new Cuenta(1500.00);
Ambas instrucciones crean objetos de la clase Cuenta, el objeto juan tiene un saldo en ceros, pero el objeto pedro tiene un saldo con 1500.
Ahora haremos uso de un método privado que en realidad no tiene sentido, pero para ejemplificar el uso de esto, con la siguiente definición de clase:
public class Cuenta {
   private double saldo; // variable para manejar el saldo
   public Cuenta() { // método para construir una cuenta vacía
      saldo = 0.0;
   }

   // método para construir una cuenta con un saldo inicial
public Cuenta(double saldo) {
      this.saldo = saldo;
   }

   // método que te dá el saldo de una cuenta
public double obtenSaldo() {
      return saldo;
   }

   // metodo privado para poner a cero el saldo
private void conCero() { 
      saldo = 0.0;
   }
   
   // método que sirve para cambiar el valor del saldo
public void cambiaSaldo(double saldo) {
   // this se utiliza porque se esta utilizando (saldo) como parámetro y como 
this.saldo = saldo;
// variable de instancia y esto es para que no se confunda
   }
}
El método privado conCero() pone en cero el saldo que se tiene, pero en realidad no se necesita, pues el método cambiaSaldo() que es quien lo llama, esta cambiando el valor del saldo, pero aqui lo que queremos hacer ver es que si hicieramos algun uso de este método como por ejemplo:
      Cuenta juan = new Cuenta(700.00);
      juan.conCero();
Esto nos daria un error, pues el método conCero() es privado y no hay manera de utilizarlo, sino solamente desde la clase, como se esta haciendo.
Un ejemplo de un método estático sería cuando necesitamos hacer uso de este método solo a través del nombre de la clase y no a través de ningún objeto.
Haremos un método que nos regrese un String (cadena de caracteres), cuando se utilizado el método, por ejemplo:
public class Cuenta {
   private double saldo; // variable para manejar el saldo
   public Cuenta() { // método para construir una cuenta vacía
      saldo = 0.0;
   }

   // método para construir una cuenta con un saldo inicial
public Cuenta(double saldo) {
      this.saldo = saldo;
   }

   // método que te dá el saldo de una cuenta
public double obtenSaldo() {
      return saldo;
   }

   // metodo privado para poner a cero el saldo
private void conCero() { 
      saldo = 0.0;
   }
   
   // solo para enseñar el uso del método estático
public static String mensaje() {   
       return "Uso del método estático";
   }

   // método que sirve para cambiar el valor del saldo
public void cambiaSaldo(double saldo) {
   // this se utiliza porque se esta utilizando (saldo) como parámetro y como 
this.saldo = saldo;
// variable de instancia y esto es para que no se confunda
   }
}
En este caso el método mensaje que es público y estático, puede ser utilizado desde fuera de la clase y no es necesario que sea referenciado por algun objeto, sino con el nombre de la clase, por ejemplo:
        Cuenta   pedro = new Cuenta(1500.00);
        t.setText("El mensaje estático es = " + Cuenta.mensaje() );
De esta manera al hacer uso del método mensaje regresará el mensaje definido en la clase.
Observemos el siguiente ejemplo de aplicación:

public class PruebaCuenta {
public static void main(String[] args) {
Cuenta cuenta1, cuenta2;
cuenta1 = new Cuenta();
cuenta2 = new Cuenta(1200.00);
System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo());
System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo());
}
}

En este ejemplo se crean dos objetos de la clase cuenta y se despliegan, una ejecución de esta aplicación sería:


Ahora si utilizamos el métodos conCero() con la siguiente aplicación:

public class PruebaCuenta {
public static void main(String[] args) {
Cuenta cuenta1, cuenta2;
cuenta1 = new Cuenta();
cuenta2 = new Cuenta(1200.00);
System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo());
System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo());
cuenta2.conCero();
System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo());
System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo());
}
}

Encontramos que esta aplicación NO COMPILA, ya que el método conCero() nos diría que tiene acceso privado en la clase, por lo tanto solo puede ser utilizado en la clase, una manera de usarlo es dentro de la clase como sigue:

La clase Cuenta quedaria:

public class Cuenta {
private double saldo; // variable para manejar el saldo
public Cuenta() { // método para construir una cuenta vacía
saldo = 0.0;
}
// método para construir una cuenta con un saldo inicial
public Cuenta(double saldo) {
this.saldo = saldo;
}
// método que te dá el saldo de una cuenta
public double obtenSaldo() {
return saldo;
}
// metodo privado para poner a cero el saldo
private void conCero() {
saldo = 0.0;
}
// solo para enseñar el uso del método estático
public static String mensaje() {
return "Uso del método estático";
}
// borra el saldo
public void borra() {
conCero();
}
// método que sirve para cambiar el valor del saldo
public void cambiaSaldo(double saldo) {
// this se utiliza porque se esta utilizando (saldo) como parámetro y como
this.saldo = saldo;
// variable de instancia y esto es para que no se confunda
}
}

Y la Aplicación sería:

public class PruebaCuenta {
public static void main(String[] args) {
Cuenta cuenta1, cuenta2;
cuenta1 = new Cuenta();
cuenta2 = new Cuenta(1200.00);
System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo());
System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo());
cuenta2.borra();
System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo());
System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo());
}
}

Una ejecución de esta aplicación sería:


Si recordamos lo que se mencionó anteriormente sobre la convención de Java, una de las convenciones no ha sido respetada en la clase Cuenta, la de borrar el saldo, es decir para hacer saldo cero, para que quede como debiera sería:

La clase Cuenta quedaría como:

public class Cuenta {
private double saldo; // variable para manejar el saldo
public Cuenta() { // método para construir una cuenta vacía
saldo = 0.0;
}
// método para construir una cuenta con un saldo inicial
public Cuenta(double saldo) {
this.saldo = saldo;
}
// método que te dá el saldo de una cuenta
public double obtenSaldo() {
return saldo;
}
// metodo privado para poner a cero el saldo
private void conCero() {
cambiaSaldo(0.0);
}
// solo para enseñar el uso del método estático
public static String mensaje() {
return "Uso del método estático";
}
// borra el saldo
public void borra() {
conCero();
}
// método que sirve para cambiar el valor del saldo
public void cambiaSaldo(double saldo) {
// this se utiliza porque se esta utilizando (saldo) como parámetro y como
this.saldo = saldo;
// variable de instancia y esto es para que no se confunda
}
}

La aplicación sería la misma, con la misma ejecución:

Utilizando ahora el método estático podemos observar que la aplicación cambia a la siguiente:

public class PruebaCuenta {
public static void main(String[] args) {
Cuenta cuenta1, cuenta2;
cuenta1 = new Cuenta();
cuenta2 = new Cuenta(1200.00);
System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo());
System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo());
cuenta2.borra();
System.out.println("Cuenta 1 = " + cuenta1.obtenSaldo());
System.out.println("Cuenta 2 = " + cuenta2.obtenSaldo());
System.out.println("Mensaje = " + Cuenta.mensaje());
System.out.println("Mensaje = " + cuenta1.mensaje());
}
}

En esta aplicación obervamos el uso del mensaje de dos maneras:

System.out.println("Mensaje = " + Cuenta.mensaje());
System.out.println("Mensaje = " + cuenta1.mensaje());

En la primera, se está utilizando la clase Cuenta, como lo hemos hecho anteriormente con otros métodos estáticos, como Math.pow(), o Integer.parseInt(). Vemos tambien que el mismo método se está utilizando con el objeto cuenta1, lo cual también es posible, ya que un objeto de la clase Cuenta puede también tener acceso al método estático.

No hay comentarios:

Publicar un comentario