Lunes 23 de Agosto

Métodos estáticos

Objetivos: Conocer como se escriben los programas cuando no se dispone de la biblioteca de cc10a. Esta materia no es esencial, pero es importante conocerla porque permite comprender por qué los programas estándares de Java se escriben con un procedimiento main que lleva el atributo static.

Temas:


Invocación de métodos de la clase

Supongamos que se está definiendo una clase Robot con métodos orden1 y orden2. Al programar orden1, nos damos cuenta que necesitamos invocar orden2. Esto se puede hacer utilizando this:

    class Robot extends Program {
      void orden1(...) {
        ...
        this.orden2(...); // o también orden2(...);
        ...
      }
      void orden2(...) { ... }
      ...
    }
Al igual que en las variables de instancia, se puede suprimir this e invocar orden2 simplemente con:

        orden2(...);
El compilador agrega automáticamente el prefijo this.


¿Funciones y procedimientos en Java?

Cuando en este curso definimos un procedimientos como:

    class Tarea extends Program {
      void run() {
        ... 
        ordenar(...);
        ...
      }
      void ordenar(int[] a, int n) {
        ...
      }
      ...
    }
¿Cómo distingue Java que Tarea es un programa y que run y ordenar son procedimientos? ¿No podría interpretar que Tarea es una clase de objetos y que run y ordenar son los métodos de la clase?

La respuesta es que Java no lo distingue: Java no posee funciones ni procedimientos. En realidad Tarea sí es una clase como cualquier otra, y run y ordenar son métodos de la clase Tarea. Es perfectamente legal invocar:

        this.ordenar(...);
De hecho, cuando no se pone, el compilador lo agrega automáticamente. ¿Y qué objeto referencia this en este caso? Es un objeto que es creado por la clase Run. En realidad la forma estándar de invocar programas en Java es:

java una clase argumentos

Y no es obligatorio que la clase sea Run. Pero en este curso hemos estado colocando siempre la clase Run en primer lugar. Esta clase se encarga de crear un objeto de la clase que se suministra como argumento. Por ejemplo al invocar:

java Run Tarea

la clase Run pertenece a la biblioteca del curso. Ejecutará las siguientes instrucciones:

    Tarea tarea= new Tarea();
    tarea.run();
o simplemente new Tarea().run();. Es decir, crea un objeto de la clase Run y luego invoca el método run.

Por lo tanto, dado que Java no posee funciones ni procedimientos, se simulan mediante métodos. El lector se preguntará por qué entonces se estudiaron los métodos como funciones y procedimientos cuando en realidad no existen.


Lenguajes Orientados a Objetos

Los lenguajes que permiten definir clases de objetos y asociar métodos a estas clases se denominan lenguajes orientados a objetos (lenguajes O-O). Ejemplos de este tipo de lenguajes son Java, C++, Eiffel, Smalltalk.

Los lenguajes O-O se usan desde hace relativamente poco tiempo. Solo en los 90 se comenzaron a usar a nivel de empresas. En los 70 y 80 se usaban lenguajes tradicionales (no orientados a objetos). Estos lenguajes sólo ofrecen mecanismos para definir funciones, procedimientos y records (pero sin métodos). Por ejemplo Fortran, Pascal, Cobol y C.

En este punto, es importante mencionar la disyuntiva existente en la actualidad con respecto a la enseñanza de Computación utilizando un lenguaje O-O como primer lenguaje. Hay profesores que opinan que es conveniente enseñar métodos y clases desde un comienzo, sin pasar por funciones y procedimientos. Otros profesores, como el autor de este documento, opinan que resulta más sencillo comenzar por programación no orientada a objetos y por ello se han simulado las funciones y procedimientos con los métodos de Java.


Métodos estáticos

Cuando se invoca un método normal siempre se suministra un objeto de la invocación que aparece a la izquierda. Por ejemplo:

    t.sumar(t2);
Cuando se diseñan los métodos que necesita un clase, inevitablemente se llega a casos en que no se necesita un objeto de la invocación. Por ejemplo, podríamos agregar a la clase Tiempo un método horaActual que entrega la hora del día.

Para este tipo de caso, Java ofrece los métodos estáticos. Este tipo de métodos no va asociado a ningún objeto. Se invocan colocando al lado izquierdo el nombre de la clase (y no un objeto):

    Tiempo ahora= Tiempo.horaActual();
Este tipo de método se define en la clase agregándoles el atributo static:

    class Tiempo extends Program {
      ...
      static Tiempo horaActual() {
        ... averiguar horas y minutos actuales ...
        return new Tiempo(horas, minutos);
      }
    }
Al programar métodos estáticos se debe tener mucho cuidado, porque dado que no van asociados a un objeto, no se puede usar el identificador this:

    class Ejemplo extends Program {
      int vari; // una variable de instancia
      static void mets(String s) { // Un método estático
        ... s ... // se pueden usar argumentos
        XXX this.vari XXX // no se puede usar this
        XXX vari XXX      // tampoco, porque esto equivale a this.vari
        XXX meti() XXX    // no se pueden invocar métodos normales
      }
      void meti() {       // un método normal
        mets("hola");     // se puede invocar Ejemplo.mets(...)
      }
    }
Explicación:

Los métodos normales también se llaman métodos de instancia (porque van asociados a una instancia de la clase). Desde un método de instancia sí se puede invocar un método estático. Si el método estático está en la misma clase, no es necesario especificar el nombre de la clase a la izquiera. El compilador lo coloca automáticamente. Por ejemplo:

    mets(...); // o también Ejemplo.mets(...)
Si se trata de un método estático de otra clase, siempre hay que colocar explícitamente el nombre de la clase.


Ejecución de programas sin la biblioteca del curso

En este curso, hemos usado sistemáticamente una biblioteca de clases escrita en su mayor parte por el autor de este documento. El objetivo ha sido simplificar la escritura de los programas. Sin embargo, en ocasiones no se podrá utilizar esta biblioteca porque no se encuentra disponible en todas las instalaciones.

Por lo tanto, en esta parte veremos cuál es la forma estándar de escribir aplicaciones en Java. Es decir, sin recurrir a bibliotecas especiales.

Como se dijo previamente, la forma estándar de ejecutar programas en Java es por medio del comando:

java nombre de clase

sin especificar Run. En estos casos, el comando java busca algún método estático que se llame main y que reciba como argumento un arreglo de strings y lo invoca. Por ejemplo, un programa que despliega Hola Mundo en la pantalla se escribiría:

    class Jalisco {
      static void main(String[] args) {
        System.out.println("Hola Mundo");
      }
    }
Observaciones:

En este curso, no será obligatorio escribir programas en la forma estándar de Java. Ud. podrá contar siempre con la biblioteca del curso. Pero para los curiosos se entregarán los conocimientos necesarios para programar sin ella.