Newsgroup: it.comp.java
Titolo: Costruttori ed array

Scusate, ho un dubbio grossissimo. Se ho una classe di questo tipo:
public class Classe
{
	public int a;
	public int b;
}
e scrivo in un'altra:
Classe oggetto = new Classe();
ho l'invocazione di un costruttore predefinito vero? Quindi avrò tutte 
le variabili a 0 o false e gli oggetti a null.
Ma se faccio:
Classe[] oggetti = new Classe[10];
non ho l'invocazione di alcun costruttore giusto? Difatti tutte le 
variabili oggetto dell'array oggetti sono a null giusto?
Quindi, se volessi chiamare un costruttore (o predefinito oppure uno di 
quelli eventualmente presenti nella classe) dovrei fare un ciclo di 
questo tipo:
for (int i = 0; i < 10; i++)
{
	oggetti[i] = new Classe(parametri);
}
in questo modo sarei a posto? L'ho provato e funziona, ma pensavo che:
Classe[] oggetti = new Classe[10];
invocasse un costruttore. Quando mi sono visto NullPointerException non 
ci ho capito più molto di questa istruzione.
Grazie per ogni chiarimento.
Luca

 Luca
anche io stavo pensando la stessa cosa. praticamente una chiamata del tipo
new Classe[10] ti crea un array di riferimenti di tipo Classe che puntano a
null. quindi per far puntare questi riferimenti a un'istanza di questa
Classe bisogna usare il for che hai descritto sopra. Il costruttore della
classe array lascia i campi a null ma ora mi viene in mente una cosa. per
inizializzare un array al momento della sua creazione basta fare cosě:
int[] a = {1, 2, 3, 4, 5, .... } la domanda che ora mi faccio č: posso
inizializzare un array di Object utilizzando questo codice Object o = {new
Classe(), new Pippo(2, 4), new Rosso("tavolo", 3) } evitando cosě il "for
di inizializzazione" ???

 di inizializzazione" ???
Certo!
Perň la sintassi corretta č:
Object o[] = new Object[]{
    new Classe(),
    new Pippo(2, 4),
    new Rosso("tavolo", 3)
};
Luca Paganelli.

 di inizializzazione" ???
Ah, ecco, allora avevo capito bene. Il dubbio mi era venuto già quando 
mi ero posto la domanda su quale fosse il costruttore invocato. Cioè, 
non essendoci neanche i parametri, quale costruttore avrebbe chiamato? 
Ora torna, nonostante ci sia new, non viene chiamato alcun costruttore.
In effetti mi sono costretto a controllare in seguito ad un esempio di 
test di esame che chiedeva in pratica cosa sarebbe successo utilizzando 
roba tipo:
NomeClasse oggetti[] = new NomeClasse[10];
invocando poi cose del genere:
System.out.println(oggetti[0].unaVariabile);
io infatti avrei risposto che tutto era ok, ma la risposta era 
NullPointerException. La spiegazione che davano però mi lascia ancora un 
pò confuso. Dicevano che la causa era il fatto che il costruttore 
standard da valori 0 a tutti i tipi numerici, false ai boolean e null 
agli oggetti. Ma è questo il vero motivo? Non si riferisce alle 
variabili oggetto d'istanza?
Grazie.
Luca

 riferisce alle variabili oggetto d'istanza?
Spero non sia stato un test universitario perche' altrimenti siamo
messi male...
Persona persone[] = new Persona[10];
[*]
Crea un "oggetto" di classe "Array di 10 riferimenti a Persona", ma
non crea gli oggetti Persona riferiti. L'indirezione e' garantita da
un oggetto intermedio "Array di 10 riferimenti a Persona", prova ne
e' il fatto che anche se scrivi
obj[0] = new Impiegato();
con Impiegato sottoclasse di Persona, non puoi (a meno di un cast
esplicito) chiamare i metodi appartenenti all'interfaccia di
Impiegato e non appartenenti all'interfaccia di Persona.
In altre parole, stai creando solo una serie contigua di riferimenti
ad oggetti di un determinato tipo, non gli oggetti stessi
[*] In generale per questioni di leggibilita' si dovrebbe scrivere
Persona[] persone = new Persona[10];
in quanto chiarisci che il tipo e' "Array di riferimenti a persona"
-- 
{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}-{}
SunGray aka Gabriele Lana
contact me @ 
gabrie...@fastwebnet.it
See you space cowboy ...

 Ora torna, nonostante ci sia new, non viene chiamato alcun costruttore.
Un array in java e' un oggetto: la "new" si riferisce alla creazione di un 
nuovo oggetto array - il cui costruttore accetta un parametro int.
-- 
You dont know what to do when you dont know what you're doing.
http://space.tin.it/computer/csadun

 Rosso("tavolo", 3) } evitando così il "for di inizializzazione" ???
certo.
-- 
Pietro	- 
http://www.pietroweb.tk
Linux Registered User #304991
Powered by *Mandrake GNU/Linux 9.2*