PDA

Visualizza la versione completa : [ JAVA ] problemi con la composizione


gordian
03-10-2004, 20:51
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:



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.. :D sto faticando a imparare da solo..
Grazie.

Dav82
04-10-2004, 00:42
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:



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 :ciauz:

gordian
04-10-2004, 16:02
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?



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);

}
}

LeleFT
04-10-2004, 17:01
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:

Loading