lunes, 25 de mayo de 2009

Invocar metodos de una clase externa desde una clase Interna en Java (anidada)

En este pequeño post veremos como podemos invocar los métodos de una clase que contiene una clase anidada con nombres de metodos y miembros(varibles)  iguales, ya que las clases anidadas pueden acceder a cualquier método o miembro de la clase que la contiene lo único que nesecitamos para invocar metodos o miembros de la clase externa es usar el nombre de la varibale o metodo como si la clase interna fuera un metodo de la clase externa, pero cuando los metodos o miembros tienen los mismos nombres ocurre un problema pues se invocan los que estan definidos en la clase interna, entonces tenemos que tener cuidado con esto.

Para poder acceder a los miembros y métodos de la clase externa que tienen nombre igual al de la clase interna tenemos que colocar el nombre de la clase externa, despues un punto, despues la palabra reservada this y por ultimo el nombre de la variable o el método que deseamos invocar o acceder, por ejemplo :

         NombreClaseExterna.this.variableUno

ó

         NombreClaseExterna.this.miembroUno()

Bien les pongo un Ejemplo:

/**
 * Definimos una clase externa con una variable nombre
 * y definimos el get y set correspondiente
 */
public class ClaseExterna {
  
  private String nombre;

  public ClaseExterna() {
  }

  public String getNombre() {
  return nombre;
  }

  public void setNombre(String nombre) {
  this.nombre = nombre;
  }
  /*
  * Aqui definimos la clase interna, la cual contiene
  * una variable nombre, un metodo para obtener la variable
  * nombre y dos metodos que imprimen un mensaje
  */
  class ClaseInterna {

  private String nombre;

  /* Constructor: Inicializa la variable nomnbre*/
  ClaseInterna(){
  nombre = "clase interna";
  }

  public String getNombre() {
  return nombre;
  }
   
  /* Aqui invocamos el miembro y el metodo de la clase interna*/
  public void hola(){
  System.out.println("Hola : " + nombre);
  System.out.println("Hola : " + getNombre());  
  }
   
  /* Aqui se invoca el miebro y el metodo de la clase externa*/
  public void holaDos(){
  System.out.println("Hola : " + ClaseExterna.this.nombre);
  System.out.println("Hola : " + ClaseExterna.this.getNombre());
  }

  }
  
  /*
  * Aqui probamos las clases, primero creamos una instancia
  * de la clase externa, despues inicializamos su variable nombre
  * posteriormente creamos una instancia de las clase interna,
  * y con el objeto que creamos de la clae interna invocamos sus
  * metodos.
  */
  public static void main(String args []){
  ClaseExterna ce = new ClaseExterna();
  ce.setNombre("Mundo");
  ClaseExterna.ClaseInterna ci = ce.new ClaseInterna();
   
  ci.hola();
  ci.holaDos();
   
  }
  
}

La salida del programa es :

Hola : clase internaHola : clase internaHola : Mundo
Hola : Mundo

Cualquier duda escriban un comentario ...

1 comentario:

multivitamine dijo...

Después de crear el objeto de la clase de archivo CallingMethod.java CallingMethod dentro de la clase de archivo MainClass.java. Es muy fácil acceso a los métodos de la clase CallingMethod. Con sólo el nombre del objeto junto con un operador de punto, cualquier método a la vez puede acceder, como se ilustra en el siguiente ejemplo.
Sintaxis para llamar a métodos: objectName. methodName ();