Miembros Estáticos en Java

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.

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 raliza 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 aceso 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.

El método main

Un programa Java se inicia proporcionando al intérprete Java un nombre de clase. 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 es 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 aquellos métodos que vayan a ser invocados 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.

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;
}
Nota: El ejemplo, una vez más, muestra sólo la sintaxis y forma de codificación. Es innecesario inicializar la variable tal como se verá más adelante. Además podría inicializarse directamente con: static int numPuntos = 0;

REFERENCIAS:arrakis