Quote Originariamente inviata da Lodin Visualizza il messaggio
sto codice infatti restituisce "diversi" e fin qui tutto chiaro.
Sì, sono oggetti diversi.

Quote Originariamente inviata da Lodin Visualizza il messaggio
s1 == s2 perchè c'è l'istruzione s2 = s1?
Sì, se non ci fosse, s2 resterebbe null e ovviamente s1 == s2 darebbe false.

Quote Originariamente inviata da Lodin Visualizza il messaggio
fa puntare s2 allo stesso indirizzo di s1 o copia il valore di s1 in s2?
Hai detto due cose che in realtà sono la STESSA cosa. Un reference è valore. Assegnare s1 a s2 significa copiare il valore (il reference) contenuto in s1 nella variabile s2 e quindi alla fine significa che entrambe le variabili faranno riferimento allo STESSO oggetto.

Quote Originariamente inviata da Lodin Visualizza il messaggio
ma se poi provo a cambiare il valore di s2, dovrebbe cambiare anche il valore di s1 e ciò non accade!
No assolutamente. Se dopo s2 = s1; vai ad assegnare "qualcos'altro" a s2, questo NON cambia nulla in s1 !
Sono comunque variabili distinte.

Quote Originariamente inviata da Lodin Visualizza il messaggio
Domanda bonus: una classe è incapsulata solo quando tutte le sue varabili sono private giusto? non è necessario che tale classe disponga anche di metodi che permettano di accedere alle varabili...giusto?
Riferito alle variabili di istanza, hai l'incapsulamento completo quando nessuna delle variabili è accessibile direttamente dall'esterno. Poi naturalmente servono i metodi "accessori" (getter e/o setter).