Che prof. ignorante, spiega solo l'applicazione pratica senza far capire cosa stai facendo davvero con static.

In java puoi dichiarare sia variabili, sia metodi, sia addirittura classi static.

Scrivendo static vicino a una variabile o a un metodo tu fai appartenere quella variabile/metodo alla classe, non agli oggetti il che significa pure, capovolgendo il discorso, che quel metodo/variabile apparterrà a tutti gli oggetti di quella classe.

Ad esempio, per le variabili, supponi di definire la classe:
codice:
public class ProvaStatic{

private static int a;

public ProvaStatic(){
    a=0;
}

public void setStatic(){
   a++;
}

public int getStatic(){
  return a;
}

public static void main(String[] args){
     ProvaStatic prova1 = new ProvaStatic(); //oggetto 1
	 ProvaStatic prova2 = new ProvaStatic(); //oggetto 2
	 
	 prova1.setStatic();
	 
	 System.out.println(prova2.getStatic()); //che valore verra' visualizzato?
	 
}

}
Se esegui questo programma ti uscirà 1 come valore: a è stato incrementato dall'oggetto prova1 eppure richiamando get da prova2 te lo ritrovi incrementato!
Se invece rimuovi la parola chiave static da a vedrai che ti uscirà zero.
Che significa questo? Che mentre senza static il compilatore crea una variabile a per ogni oggetto della classe, con static la variabile a è condivisa oltre che presente fin da subito quando definisci la classe.

Con i metodi capita più o meno la stessa cosa: il metodo esiste nel momento in cui definisci la classe, quindi lo puoi richiamare anche senza instanziare nessun oggetto della classe medesima come già ti hanno fatto vedere.

Attenzione a usare variabili/metodi static perché, essendo questi creati a prescindere dall'instanziazione o meno degli oggetti, vanno a occupare da subito spazio in memoria e il tuo programma crescerà di dimensioni.