
Cada instancia de una clase, cada objeto, tiene su propia copia de las variables de la clase. Cuando interese que haya miembros que no estén ligados a los objetos sino a la clase, y por lo tanto comunes a todos los objetos, estos se declaran static.
Variables static
Las variables de clase static son compartidas por todos los objetos de la clase. Se declaran de igual manera que otra variable, añadiendo como prefijo la palabra reservada static.
Ejemplo
public class Conjunto {
private static int k=0;
static Totem lista = null;
// . . .
}
Las variables miembro static no forman parte de los objetos de la clase sino de la propia clase. Dentro de las clases se accede a ellas de la manera habitual, simplemente con su nombre. Desde fuera de la clase se accede con el nombre de la clase, el selector y el nombre de la variable:
Conjunto.lista = . . . ;
También se puede acceder a través de un objeto de la clase, aunque no es recomendable ya que los miembros static no pertenecen a los objetos sino a las clases.
Métodos static
Los métodos de las clases se llaman a través de los objetos. En ocasiones interesa definir métodos que estén controlados por la clase, que no haga falta crear un objeto para llamarlos; son los métodos static. Muchos métodos de la biblioteca Java están definidos como static. Es, por ejemplo, el caso de los métodos matemáticos de la clase Math: Math.sin(), Math.sqrt().
La llamada a los métodos static se realiza a través de la clase: NombreClase.metodo(), respetando las reglas de visibilidad. También se pueden llamar con un objeto de la clase, aunque no es recomendable debido a que son métodos dependientes de la clase y no de los objetos.
Los métodos definidos como static no tienen asignada la referencia this, por ello solo pueden acceder a miembros static de la clase. Es un error que un método static acceda a miembros de la clase no static.
Ejemplo
public class Fiesta {
int precio;
String cartel;
public static void main(String[] args){
cartel = «Rosa de Guadalupe»;
precio = 1;
}
}
al compilar da dos errores debido a que desde el método main(), definido como static se accede a miembros no static.
Ejemplo
La clase SumaSerie define tres variables static, y un método static que calcula la suma cada vez que se llama.
public class SumaSerie {
private static long n;
private static long m;
static{
n = 0;
m = 1;
}
public static long suma(){
m = m+n;
n = m-n;
}
}