Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    lettura locazione di memoria

    Ciao a tutti.

    Sono un novellino di java.
    Sto cominciando ad apprendere il linguaggio con uno dei tanti manuali in circolazione.
    Sono alle prese con un esercizio di cui non viene data la soluzione:
    ho creato una classe, ne ho istanziato 5 oggetti e li ho popolati di dati.

    Il mio problema è che quando cerco si stampare i dati di un oggetto, il metodo System.out.println(),
    mi restituisce gli indirizzi degli attributi e non il loro valore.

    Gli attributi sono 3 stringhe (nome, cognome, età).

    Come devo codificare le istruzioni per leggere e stampare tali stringhe?

    Ringrazio anticipatamente chi mi vorrà dare suggerimenti.

    Stefanone49

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Immagino che tu ti sia dimenticato di ridefinire il metodo toString().
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Soluzione 1: nel System.out.println() passi ciascun attributo.
    Soluzione 2: la classe che hai creato dovrebbe ridefinire il metodo toString() in modo da "concatenare" i tre valori e restituire la stringa risultante (o fare qualunque altra cosa in modo da costruire una stringa che dia una "rappresentazione in forma di stringa" dell'oggetto). In questo modo, passando a System.out.println() l'oggetto, verrà invocato il metodo toString() che farà il lavoro.

    (le due soluzioni, ovviamente, non si escludono a vicenda)


    Esempio pratico.

    codice:
    public class Pippo {
       private String nome;
       private String cognome;
       private String eta;
    
       // Metodi setter, per assegnare i valori
       public void setNome(String nome) { this.nome = nome; }
       public void setCognome(String cognome) { this.cognome = cognome; }
       public void setEta(String eta) { this.eta = eta; }
    
       // Metodi getter, per ottenere i valori
       public String getNome() { return nome; }
       public String getCognome() { return cognome; }
       public String getEta() { return eta; }
    
       // Ridefinizione di toString()
       @Override
       public String toString() {
          return "Cognome: " + cognome + "; Nome: " + nome + "; Eta: " + eta;
       }
    }

    Come si applica la soluzione 1:

    codice:
    // Creo l'istanza
    Pippo p = new Pippo();
    
    // Setto i valori
    p.setCognome("Rossi");
    p.setNome("Mario");
    p.setEta("25");
    
    // Stampo i valori
    System.out.println( p.getCognome() );
    System.out.println( p.getNome() );
    System.out.println( p.getEta() );

    Come si applica la soluzione 2:

    codice:
    // Creo l'istanza
    Pippo p = new Pippo();
    
    // Setto i valori
    p.setCognome("Rossi");
    p.setNome("Mario");
    p.setEta("25");
    
    // Stampo i valori
    System.out.println( p );   // E' necessario aver ridefinito il toString()

    Ciao.
    Ultima modifica di LeleFT; 24-04-2014 a 10:09
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    A dire la verità ho appena una vaga idea del metodo toString().
    Dove devo codificarlo e con quale sintassi?

  5. #5
    Grazie a entrambi.
    Ora mi ci applico.

    Stefanone49

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    @lele:

    Pignoleria:

    codice:
    @Override
    public String toString() {
        return "Cognome: " + cognome + "; Nome: " + nome + "; Eta: " + eta;
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Ma il descrittivo *@override* è facoltativo e si aggiunge solo per chiarezza di lettura del listato, vero?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da stefanone49 Visualizza il messaggio
    Ma il descrittivo *@override* è facoltativo e si aggiunge solo per chiarezza di lettura del listato, vero?
    @Override è da Java 5, innanzitutto. Se metti @Override ad un metodo e questo, per tuo sbaglio nella scrittura della signature (es. toSting) non fa davvero l'override, allora il compilatore emette un errore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    @Alex: me n'ero accorto e avevo modificato al volo.

    @stefanone49: è facoltativo, ma non si aggiunge solo per chiarezza di lettura. Al contrario, serve a evitare errori "stupidi". Questo tipo di annotazione viene letto dal compilatore che, quindi, attua alcuni meccanismi di controllo. Tramite quell'annotazione noi stiamo dicendo al compilatore che stiamo facendo l'override di un metodo ereditato. Il compilatore, quindi, va a verificare se questa cosa è vera, cioè: cerca in tutte le superclassi e interfaccie se esiste quel metodo. Se lo trova, tutto ok. Se non lo trova, il compilatore segnala l'errore. Questo è molto utile per evitare, appunto, errori "stupidi" come il nome di un metodo digitato male.


    Esempio:

    codice:
    public class Pippo {
       ...
       public String toStringa() { return "ciao"; }
    }

    Senza l'annotazione, il compilatore tira dritto e non ha alcuna possibilità di sapere se vi sono errori (osserva bene quel metodo: ho scritto male ed ho aggiunto una "a" alla fine). Io sono convinto di aver correttamente fatto l'override del metodo "toString()", in realtà ho solo definito un nuovo metodo, che nessuno userà mai. Per il compilatore non c'è nessun errore. Ma quando eseguo, non otterrò mai la scritta "ciao" quando butto in output un oggetto di classe Pippo. E così sono costretto a perdere un sacco di tempo a caccia del problema... un problema "subdolo" che difficilmente salta all'occhio.

    Aggiungendo l'annotazione, invece, è il compilatore che si accorge subito del problema: lui controllerà se le superclassi (in questo caso, Object) contengono un metodo chiamato "toStringa()", che restituisce un String. Non lo trova e segnala l'errore.

    Quindi, non è obbligatorio metterla, ma è un modo per assicurarci di star facendo la cosa giusta, quindi è consigliabile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Grazie a entrambi per il chiarimento assai importante.
    Adesso ho le idee un po' più chiare.

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.