Originariamente inviato da gujelmo
ok, la differenze tra statico e d'istanza forse l'ho capita..

ma l'uso del this mi rimane veramente arcano...
In sostanza, quando crei un oggetto non viene creata alcuna copia di una variabile statica, poichè questa sarà in comune a tutti gli oggetti (quindi modificando il valore di quella variabile di un oggetto A, modifichi anche il valore di quella variabile dell'oggetto B).

Questo esempio (banale) ti chiarirà le cose:
codice:
class EsempioStatic {
  private int a = 5;
  private static int b;

  static {
    b = 0;
  }
  
  int getA() {
    return a;
  }
  int getB() {
    return b;
  }
  
  void sommaA(int n) {
    a += n;
  }
  void sommaB(int n) {
    b +=n;
  }
}

class Esempio {
  public static void main(String[] args) {
    EsempioStatic primo = new EsempioStatic();
	EsempioStatic secondo = new EsempioStatic();
	System.out.println("Prima di operare modifiche:\n");
	System.out.println("primo.getA(): "+primo.getA());
	System.out.println("primo.getB(): "+primo.getB()+"\n");
	System.out.println("secondo.getA(): "+secondo.getA());
	System.out.println("secondo.getB(): "+secondo.getB());
	System.out.println("\nOra modifichiamo i valori..\n");
	primo.sommaA(10);
	primo.sommaB(100);
	System.out.println("Dopo alle modifiche: ");
	System.out.println("primo.getA(): "+primo.getA());
	System.out.println("primo.getB(): "+primo.getB()+"\n");
	System.out.println("secondo.getA(): "+secondo.getA());
	System.out.println("secondo.getB(): "+secondo.getB());
  }
}
Output:

codice:
Prima di operare modifiche:

primo.getA(): 5
primo.getB(): 0

secondo.getA(): 5
secondo.getB(): 0

Ora modifichiamo i valori..

Dopo alle modifiche:
primo.getA(): 15
primo.getB(): 100

secondo.getA(): 5
secondo.getB(): 100

Come puoi notare, alla variabile a della classe EsempioStatic come valore di default a 5, mentre la variabile statica ha valore 0. Alla prima stampa infatti osserviamo come entrambi i nostri oggetti "primo" e "secondo" abbiano come valore di getA() (ovvero la variabile a) il valore 5 e per la b il valore 0.

Come puoi vedere, dopo alla modifica delle variabili a e b dell'oggetto primo, la variabile a cambia valore, diventa 15, e la variabile b 100, proprio come abbiamo deciso noi.
Quando stampiamo le variabili a e b dell'oggetto secondo vediamo che il valore di a è rimasto quello di partenza, ovvero 5, mentre quello di b è lo stesso dell'oggetto primo!

La variabile a è una variabile di istanza, quindi viene creata una copia di quella variabile per ogni oggetto. Mentre per una variabile static non avviene la stessa cosa...in sostanza quella variabile è condivisa da tutti gli oggetti che creeremo.

I metodi statici sono diversi..evito anche di accennarli.

La parola chiave this si riferisce all'oggetto corrente, generalmente viene utilizzata nei costruttori e nei metodi setter per evitare di utilizzare un parametro di un metodo diverso dalla variabile di istanza.
Guarda qui:
codice:
class MiaClasse {
  private int a,b;

  MiaClasse(int a, int b) {
    this.a = a;
    this.b = b;
  }
  // metodi ecc.

}
Qui, se non usassimo il this, la variabile a di MiaClasse avrebbe il valore che assegna Java di default, ovvero 0. Questo perchè quando si hanno 2 variabili con lo stesso nome, una nasconde l'altra.

Cerco di spiegarmi meglio:
il this si riferisce all'oggetto corrente. Nella forma vista li sopra, diciamo "prendi la variabile a di questo (this) oggetto ed assegnale il valore del parametro a" (stessa cosa per b ovviamente).

Se noi levassimo il this useremmo la variabile a, ma non quella della classe..bensì il parametro del costruttore! Quindi sarebbe come scrivere (supponiamo di passare come parametri a = 5 e b = 10)
codice:
MiaClasse(int a, int b) {
  a = a; // (parametro) a (5) = (parametro) a (5);
  b = b; // Idem come sopra, ma con il valore 10
}
Quindi grazie al this, diciamo a java che la variabile a di MiaClasse è uguale al parametro a.

Ovviamente, il this riferendosi all'oggetto corrente, permette di chiamare un metodo che si trova nella stessa classe.
Esempio stupido; immagina una classe che contiene questi metodi (mi viene in mente solo questo esempio al momento, perchè è semplice e veloce xD)
codice:
class Numeri {
  // variabili e costruttore...

  boolean controlla(int n) {
    if(n %2 == 0) return true;
    else return false;
  }

  boolean isPari(int n) {
    return controlla(n);
  }
}
ora questo
codice:
class Numeri {
  // variabili e costruttore...

  boolean controlla(int n) {
    if(n %2 == 0) return true;
    else return false;
  }

  boolean isPari(int n) {
    return this.controlla(n);
  }
}
Nel primo esempio viene chiamato il metodo controlla passando n come parametro. E' ovvio si stesse chiamando il metodo controlla di quella classe, quindi all'interno dell'oggetto che stiamo manipolando ora! Ma nessuno ci vieta di fare come nel secondo esempio, dove poniamo il this davanti a controlla. Questo è inutile, poichè come già detto, ci si riferisce all'oggetto corrente (quindi nel caso 2 stiamo dicendo "chiama il metodo controlla(n) su questo oggetto")


Ovviamente capita di utilizzare spesso la forma che ti ho mostrato sopra riguardo alle variabili di istanza.
Ora non so se per l'orario o perchè ho detto tutto, non mi vengono altri esempi di utilizzo.

Spero di essere stato chiaro!