Sì, sono oggetti diversi.
Sì, se non ci fosse, s2 resterebbe null e ovviamente s1 == s2 darebbe false.
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.
No assolutamente. Se dopo s2 = s1; vai ad assegnare "qualcos'altro" a s2, questo NON cambia nulla in s1 !
Sono comunque variabili distinte.
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).