O atributo é partilhado por todas as instâncias da classe.
class StaticInt {
static int i = 1;
}
Utilização hipotética:
StaticInt.i++;
Utilização possível, mas não recomendada:
StaticInt si = new StaticInt();
si.i++; // "i" é independente de "si"
O mesmo fragmento, com o mesmo significado, mas melhor estilo (a referência a i
faz-se através da classe e não de um objecto particular):
StaticInt si = new StaticInt();
StaticInt.i++;
Ou seja, o facto de existirem objectos de uma classe não significa que sejam a forma preferencial para invocar métodos.
O método pode ser invocado sem que seja necessária a existência de instâncias da classe. Isto quer dizer que o método se comporta, na realidade, como uma função (não necessita do contexto de nenhum objecto em particular).
Definição das classes:
class StaticInt { static int i = 1; } // exemplo anterior
class StaticMeth {
static void incr() { return StaticInt.i++; }
}
Invocação do método:
StaticMeth.incr(); // o valor de "StaticInt.i" é agora "2"
Utilização possível, mas não recomendada (ver explicação acima):
StaticMeth sm = new StaticMeth();
sm.incr(); // "incr" é independente do contexto de "sm"