Semplicemente quando non hai bisogno che un determinato metodo debba essere eseguito su un oggetto in particolare. Ti faccio un esempio:
Mettiamo che tu voglia creare una classe Amministratore, e per diversi motivi vuoi che si debba creare una sola istanza di Amministratore (cioè un solo amministratore).
Come fai?
Codice:
public class Amministratore {
private static Amministratore admin;
private String nome;
private Amministratore(String nome) {
this.nome = nome;
}
public static Amministratore creaAmministratore(String nome) {
if (admin!=null) {
System.out.println("Attenzione amministratore già creato!");
return admin;
}
System.out.println("Creo un nuovo amministratore col nome: "+nome);
admin = new Amministratore(nome);
return admin;
}
public String getNome() {
return nome;
}
...
}
In sostanza puoi notare che gli attributi static e i metodi static vengono creati PRIMA che venga creato ogni oggetto della classe Amministratore.
Notare anche che il costruttore è privato quindi non puoi creare direttamente oggetti col classico new Amministratore(nome) ma devi invocare il metodo STATICO creaAmministratore(String nome).
Se chiamo Amministratore amm = Amministratore.creaAmministratore("Io") ->
La prima volta l'output sarà:
Codice:
Creo un nuovo amministratore col nome: Io
Se lo chiami un'altra volta l'output sarà:
Codice:
Attenzione amministratore già creato!
E ti verrà restituito l'amministratore corrente.
Variabili e metodi Static esistono prima di ogni istanza dell'oggetto.