Apuntes Java: Clases – Miembros estáticos

Datos estáticos

Un dato estático es una variable miembro que no se asocia a un objeto (instancia) de una clase, sino que se asocia a la clase misma; no hay una copia del dato para cada objeto sino una sola copia que es compartida por todos los objetos de la clase. A las variables estáticas se les llama a veces 'Variables de clase'. Por contraposición a las variables no estáticas se les llama 'Variables de objeto' (o de instancia). Por ejemplo:

class Punto {
    int x , y ;
    static int numPuntos = 0;

    Punto ( int a , int b ) {
        x = a ; y = b;
        numPuntos ++ ;
    }
}

En el ejemplo numPuntos es un contador que se incrementa cada vez que se crea una instancia de la clase Punto.

Observese la forma en que se declara numPuntos, colocando el modificador static delante del tipo. La sintaxis general para declarar una variable es:

[modificadores] tipo_variable nombre;

static es un modificador. En los siguientes capítulos se irán viendo otros modificadores. Los [ ] en la expresión anterior quieren decir que los modificadores son opcionales.

El acceso a las variables estáticas desde fuera de la clase donde se definen se realiza a través del nombre de la clase y no del nombre del objeto como sucede con las variables miembro normales (no estáticas). En el ejemplo anterior puede escribirse:

int x = Punto.numPuntos;

No obstante también es posible acceder a las variables estáticas a través de una referencia a un objeto de la clase. Por ejemplo:

Punto p = new Punto();
int x = p.numPuntos;

Las variables estáticas de una clase existen, se inicializan y pueden usarse antes de que se cree ningún objeto de la clase.

 Métodos estáticos

Para los métodos, la idea es la misma que para los datos: los métodos estáticos se asocian a una clase, no a una instancia.

Por ejemplo:

class Punto {
    int x , y ;
    static int numPuntos = 0;

    Punto ( int a , int b ) {
        x = a ; y = b;
        numPuntos ++ ;
    }

    static int cuantosPuntos() {
        return numPuntos;
    }
}

La sintaxis general para la definición de los métodos es, por tanto, la siguiente:

[modificadores ] Tipo_Valor_devuelto nombre_método ( lista_argumentos ) {
         bloque_de_codigo;
}

El acceso a los métodos estáticos se hace igual que a los datos estáticos, es decir, usando el nombre de la clase, en lugar de usar una referencia:

int totalPuntos = Punto.cuantosPuntos();

Dado que los métodos estáticos tienen sentido a nivel de clase y no a nivel de objeto (instancia) los métodos estáticos no pueden acceder a datos miembros que no sean estáticos, ni pueden invocar métodos de la clase a la que pertenecen que no sean otros métodos estáticos.

El método main

Un programa Java se inicia proporcionando al intérprete Java un nombre de clase, con el que comenzar la ejecución. La JVM carga en memoria la clase indicada e inicia su ejecución por un método estático que debe estar codificado en esa clase. El nombre de este método se llama main y debe declararse de la siguiente forma:

static void main ( String [] args) {

}
  • Es un método estático. Se aplica por tanto a la clase y no a una instancia en particular, lo que es conveniente puesto que en el momento de iniciar la ejecución todavía no se ha creado ninguna instancia de ninguna clase.
  • Recibe un argumento de tipo String []. String es una clase que representa una cadena de caracteres ( se verá más adelante),
  • Los corchetes [] indican que se trata de un array que se verán en un capítulo posterior.

No es obligatorio que todas las clases declaren un método main . Sólo aquellas clases que vayan a ser invocadas directamente desde la línea de comandos de la JVM necesitan tenerlo. En la práctica la mayor parte de las clases no lo tienen.

Nota: El mecanismo de ejecución descrito es aplicable a programas Java independientes, que se invocan llamando directamente a la máquina virtual Java, e indicando el nombre de la clase que se quiere ejecutar. Otros tipos de programas Java, como por ejemplo los Applets no siguen esta convención y no necesitan método main.

Para ver detalles de como ejecutar un programa invocando la JVM puedes ir aquí.

Inicializadores estáticos

En ocasiones es necesario escribir código para inicializar los datos estáticos, quizá creando algún otro objeto de alguna clase o realizando algún tipo de control. El fragmento de código que realiza esta tarea se llama inicializador estático. Es un bloque de sentencias que no tiene nombre, ni recibe argumentos, ni devuelve valor. Simplemente se declara con el modificador static .

La forma de declarar el inicializador estático es:

static { bloque_codigo }

Por ejemplo:

class Punto {
    int x , y ;
    static int numPuntos;

    static {
        numPuntos = 0;
    }

    Punto ( int a , int b ) {
        x = a ; y = b;
        numPuntos ++ ;
    }

    static int cuantosPuntos() {
        return numPuntos;
    }
}

El ejemplo, una vez más, muestra sólo la sintaxis y forma de codificación. La varialbe numPuntos podría inicializarse simplemente con:

static int numPuntos = 0;

Los inicializadores estáticos siguen las mismas normas que los métodos estáticos, es decir, no pueden referenciar datos miembros que no sean estáticos ni usar otros métodos de la clase que no sean estáticos.

Última actualización: 30/10/2016