Salve a tutti,
avrei bisogno di un chiarimento per quanto riguarda il confronto di valori di tipi di variabili non primitive.

Io so che quando si effettua un confronto tra due tipi non primitivi, tale confronto viene effettuato sull'indirizzo.
Es:

codice:
Integer x = new Integer(1);
Integer y = new Integer(1);

if (x == y) then
   System.out.print("uguali");
else
   System.out.print("diversi");
sto codice infatti restituisce "diversi" e fin qui tutto chiaro.

Ora, perché se eseguo sto codice:
codice:
class G {
  private Boolean b1;
  private Boolean b2;
  private String s1 = new String("ab");
  Object s2;
  
  void q() {
    b2 = new Boolean(false);
    s2 = s1;
    m(new Integer(1));
  }

  void m(Integer i1) {
    Integer i2;
    i2 = new Integer(1);
    b1 = new Boolean(false);
    
    if(i1 == i2) {
      System.out.print(1);
    } else {
      System.out.print(0);
    }

    if(b1 == b2) { 

      System.out.print(1);
    } else {
      System.out.print(0);
    }

    if(s1 == s2) {
     System.out.print(1);
    } else {
     System.out.print(0);
    }
  }
}
L'output è 001?

i1 != i2 perchè confronta gli indirizzi.
b1 != b2 perchè confronta gli indirizzi.
s1 == s2 perchè c'è l'istruzione s2 = s1? ma s2 = s1 precisamente, cosa fa? fa puntare s2 allo stesso indirizzo di s1 o copia il valore di s1 in s2?
Nel primo caso il risultato positivo del confronto sarebbe giustificato, ma se poi provo a cambiare il valore di s2, dovrebbe cambiare anche il valore di s1 e ciò non accade!

:S


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?