Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55

    [JAVA] Chiarimento operatore == e tipi non primitivi

    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?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    Quote Originariamente inviata da andbin Visualizza il messaggio
    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).

    Potresti spiegarmi come mai in questo esercizio b1 è uguale a b2?:

    codice:
    class C {
    private Boolean b3 = new Boolean(true);
    private Boolean b4;
    private String s4 = new String("ab");
    private String s5;
    
    void p() {
     String s3;
     s3 = new String("abcde");
     b4 = b3;
     s5 = new String("ab");
     q(s3, b3, b4);
    }
    
    void q(String s2, Boolean b1, Boolean b2){
     String s1;
     s1 = new String("abcde");
     if(s2 == s1) {
      System.out.print(1);
     } else {
      System.out.print(0);
     }
     if(b1 == b2) {
      System.out.print(1);
     } else {
      System.out.print(0);
     }
     if(s4 == s5) {
      System.out.print(1);
     } else {
      System.out.print(0);
     }
    }
    }
    b1 e b2 hanno entrambi valore true (perchè in p b4=b3) ma essendop tipi non primitvi, il loro confronto con == non dovrebbe restituire 0?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    b1 e b2 hanno entrambi valore true (perchè in p b4=b3) ma essendop tipi non primitvi, il loro confronto con == non dovrebbe restituire 0?
    Per via del b4 = b3; le due variabili hanno lo stesso valore ovvero il medesimo riferimento ad un singolo oggetto Boolean. Vengono poi passate a q() come b1 e b2 e quindi b1 == b2 così è "vero".

    Con i tipi reference, == confronta il valore del riferimento. Quindi x == y è true solo se le due variabili x e y hanno entrambe una copia di un riferimento ad un certo oggetto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.