Un membro (variabile o metodo) static appartiene alla classe, non a ciascun singolo oggetto. Al contrario, un membro non static appartiene all'oggetto, quindi è distinto per ciascuna istanza della classe.

Prova questo:

codice:
public class Prova {
    private static int sCont;
    private int iCont;

    public Prova() {
        sCont++;
        iCont++;
    }

    public String toString() {
        return "sCont=" + sCont + "  iCont=" + iCont;
    }

    public static void main(String[] args) {
        Prova p1 = new Prova();
        Prova p2 = new Prova();
        Prova p3 = new Prova();
        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p3);
    }
}

Vedrai che sCont viene stampato da tutti gli oggetti come 3. Questo perché sCont appartiene alla classe, c'è una sola variabile per così dire "globale". Mentre iCont è "di istanza", ciascun oggetto ha il SUO campo iCont distinto da quello degli altri oggetti.