Android

Android


A.21. Otras características de Java » A.21.4. Clases y métodos abstractos

Página 21 de 25

     // metodo para evaluar una funcion

     // proporcionada en la interfaz Funcion

    double evalua(double x, Funcion portador){

       double valor=portador.f(x);

       return valor;

   }

  }

    // interfaz que lleva una funcion

    interface Funcion{

      double f(double x);

    }

Aunque esta notación es compacta y es utilizada por muchos programadores, implementar una interfaz con una clase anónima dentro del argumento de un método puede resultar confuso para el principiante, pues el código resulta más difícil de entender. Sólo con la práctica se llega a dominar esta técnica. Para comenzar se aconseja implementar explícitamente las interfaces con clases no anónimas. La utilidad de la clase anónima surgirá por sí sola.

Para terminar esta discusión, el siguiente ejemplo muestra la versión del programa de la figura A.25. implementado con clases anónimas.

  public class EjemploJava1 extends Activity {

     TextView tv;

     @Override

     public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         setContentView(R.layout.main);

         tv= (TextView) findViewById(R.id.textView);

         tv.setText("Ejemplo de interfaz");

         // array bidimensional

         double[][] miArray;

         miArray=new double[4][3];

         // Llamada al método con segundo argumento un objeto

         // de una clase anónima implementando una interfaz

         recorreArray(miArray,new Manipulador(){

           public void manipula(double[][] a, int i, int j) {

                   a[i][j]=10*i+j;

          }

         });

         recorreArray(miArray,new Manipulador(){

          public void manipula(double[][] a,int i, int j){

             tv.append("\n a("+i+","+j+") = "+a[i][j]);

          }

         });

     }

     // metodo para realizar acciones sobre un array

     // usando la interfaz Manipulador

    void recorreArray(double[][] miArray, Manipulador m){

       for (int i=0;i<miArray.length;i++){

          for(int j=0;j<miArray[i].length;j++){

             m.manipula(miArray,i,j);

          }

       }

    }

  }

    // interfaz para manipular un array

    interface Manipulador{

      void manipula(double[][] a,int i,int j);

    }

A.21. Otras características de Java

A.21.1. Paquetes

En Java las clases se agrupan en paquetes, especificados en la primera línea del fichero:

   package es.ugr.amaro;

Esto indica que el fichero .class, obtenido al compilar el fichero .java, está localizado en el subdirectorio es/ugr/amaro. Todas las clases del mismo paquete están en el mismo directorio. Para evitar problemas, se aconseja utilizar nombres únicos para los paquetes, como un nombre de dominio o de correo electrónico.  Para que una clase pueda utilizar otra clase definida en otro paquete se debe especificar ésta con la orden import al principio del fichero. Por ejemplo, para usar la clase EjemploJava1 del paquete es.ugr.amaro, escribiríamos:

   import es.ugr.amaro.EjemploJava1;

Se pueden importar todas las clase de un paquete escribiendo un asterisco:

   import es.ugr.amaro.*

A.21.2. Clases públicas

Por defecto, las clases son privadas y sólo son accesibles a las otras clases de su mismo paquete. Si queremos que una clase sea pública y pueda ser importada por clases en otros paquetes, debemos declararla como public. Por ejemplo:

   public class EjemploJava1{

   ...

   }

A.21.3. Privilegios de acceso de los métodos y variables

Aunque una clase sea pública, sus métodos y variables tienen su propio tipo de acceso, que puede ser de cuatro tipos: public, protected, private, o el tipo por defecto, si no se especifica nada. La diferencia está en el tipo de clases que pueden acceder a ellos.

•   public: es el tipo menos restrictivo, permitiendo acceso a todas las clases. Es decir, si un método es public, puede invocarse desde cualquier clase de cualquier paquete.

•   protected: no permite el acceso a las clases de otro paquete, a no ser que sean sub-clases de la clase que contiene el método o variable.

•   tipo por defecto: si no se especifica nada, no permite el acceso a las clases de otro paquete. Dicho de otro modo, los métodos no pueden ser ejecutados por clases de otro paquete. Si queremos que lo sean, deben ser declarados públicos.

•   private: es el tipo más rectictivo. No es accesible ni siquiera a las clases del mismo paquete. Sólo lo puede ejecutar la clase que lo contiene.

A.21.4. Clases y métodos abstractos

Una clase abstracta se declara precediéndola del comando abstract. Las clases abstractas son similares a las interfaces, conteniendo lo que se denomina métodos abstractos, precedidos también de la palabra abstract, y que sólo están declarados, pero no implementados. Las clases abstractas se diferencian de las interfaces en que también pueden contener métodos concretos, es decir, implementados. No se puede crear un objeto de una clase abstracta, sino sólo de una de sus subclases que implemente todos sus métodos abstractos.

Ir a la siguiente página

Report Page