Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di gordian
    Registrato dal
    Sep 2002
    Messaggi
    1,139

    [ JAVA ] problemi con la composizione

    Ciao a tutti,

    stavo cercando di fare pratica personalizandomi un esempio di un libro.
    L'obiettivo è quello di creare oggetti di una classe dentro un'altra classe (composizione).

    Il mio file è questo:

    codice:
    class Richiamata
    {
      private String s;
    
      //costruttore
      Richiamata()
       { s = new String("testo"); }
    
    }
    
    public class Composizione
    {
      private String s1 = new String("Happy");
      private String s2 = "Happy";
      private String s3;
      private String s4;
     
    
      //costruttore
      public Composizione()
      {
        s4 = new Richiamata();
      }
    
      public String toString()
      {
        //s3 non è stato inizializzato quindi assume il valore null
        if(s3 == null)
    
        s3 = new String("Joy");
        return
          "s1 = " + s1 + "\n" +
          "s2 = " + s2 + "\n" +
          "s3 = " + s3 + "\n" +
          "s4 = " + s4;
      }
      public static void main(String[] args)
      {
        Composizione b = new Composizione();
        System.out.println(b);
    
      }
    }
    Sapete dirmi come mai non riesco ad assegnare la stringa "testo" a "s4"??

    Inoltre non mi è molto chiaro a cosa serva in generale il metodo "toString()" di java.lang.. :master:

    Abbiate pazienza per favore.. sto faticando a imparare da solo..
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    12
    Ciao.

    Non riesci ad assegnare a s4 il valore "testo" poichè l'istruzione "new Richiamata" fornisce un valore di tipo Richiamata, e non di tipo String, come serve ad s4. E' come se tu volessi scrivere una cosa del genere:

    codice:
    int i;
    i = new JMenu();
    I tipi sono incompatibili.
    Tra l'altro dovrebbe darti un errore di compilazione...

    Un'altra cosa: tu volevi assegnare il valore "testo" ad s4. Tralasciando l'errore di tipo, la cosa comunque non funzionava. Infatti, il costruttore della classe interna Richiamata non fa in modo di assegnare un determinato valore ad un oggetto passatogli come parametro, ma semplicemente assegna ad un attributo della propria classe il valore "testo". In sostanza, se anche fosse che Richiamata estende String, e quindi non ci sarebbero errori di tipo, comunque non avresti ciò che ti sei prefissato


    Per quanto riguarda il metodo toString(): questo è un metodo della classe Object, quindi tutti le classi che ereditano da Object (quindi tutte tutte!) possiedono questo metodo. Serve per dare una rappresentazione scritta dell'oggetto, attraverso la descrizione dei suoi attributi. Se per esempio stiamo parlando di un menù, il suo metodo toString() potrà fornire, ad esempio, informazioni riguardanti le voci di menù presenti, se queste sono selezionate o meno, il colore di sfondo del menù, ecc ecc...

    Ovviamente se per una determinata classe il metodo toString() non viene ridefinito, viene usata la definizione del metodo toString() della classe da cui eredita.

    Ciao

  3. #3
    Utente di HTML.it L'avatar di gordian
    Registrato dal
    Sep 2002
    Messaggi
    1,139
    Originariamente inviato da Dav82
    Un'altra cosa: tu volevi assegnare il valore "testo" ad s4. Tralasciando l'errore di tipo, la cosa comunque non funzionava. Infatti, il costruttore della classe interna Richiamata non fa in modo di assegnare un determinato valore ad un oggetto passatogli come parametro, ma semplicemente assegna ad un attributo della propria classe il valore "testo". In sostanza, se anche fosse che Richiamata estende String, e quindi non ci sarebbero errori di tipo, comunque non avresti ciò che ti sei prefissato
    Così mi sembra di esserci riuscito però..
    Ho messo toString dentro alla classe Richiamata e sono riuscito a stampare la stringa.
    E' sensato come concetto?

    codice:
    class Richiamata
    {
      private String s;
    
      //costruttore
      Richiamata()
       { s = new String("testo"); }
    public String toString()
       { return s; }
    }
    
    public class Composizione
    {
      private String s1 = new String("Happy");
      private String s2 = "Happy";
      private String s3;
      private Richiamata s4;
     
    
      //costruttore
      public Composizione()
      {
        s4 = new Richiamata();
      }
    
      public String toString()
      {
        //s3 non è stato inizializzato quindi assume il valore null
        if(s3 == null)
    
        s3 = new String("Joy");
        return
          "s1 = " + s1 + "\n" +
          "s2 = " + s2 + "\n" +
          "s3 = " + s3 + "\n" +
          "s4 = " + s4;
      }
      public static void main(String[] args)
      {
        Composizione b = new Composizione();
        System.out.println(b);
    
      }
    }

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    La cosa è sensata, ma ha tutto un altro significato: l'oggetto s4 è comunque un oggetto di tipo Richiamata. Quando, poi, lo utilizzi all'interno di un'espressione (tramite concatenazione), Java richiama automaticamente il metodo toString() della classe. Se la classe non lo implementa (non lo sottopone ad override), verrà richiamato di default il metodo della classe Object (intrinseco in ogni toggetto).


    Ciao. :cizauz:
    "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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.