Discussione:
Costruttori ed array
(troppo vecchio per rispondere)
Luca
2003-12-14 09:54:49 UTC
Permalink
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
ciccio
2003-12-14 11:08:20 UTC
Permalink
Post by Luca
public class Classe
{
public int a;
public int b;
}
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.
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
for (int i = 0; i < 10; i++)
{
oggetti[i] = new Classe(parametri);
}
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
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" ???
Luca Paganelli
2003-12-14 16:41:45 UTC
Permalink
Post by ciccio
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" ???
Certo!
Però la sintassi corretta è:

Object o[] = new Object[]{
new Classe(),
new Pippo(2, 4),
new Rosso("tavolo", 3)
};


Luca Paganelli.
Luca
2003-12-14 17:30:23 UTC
Permalink
Post by ciccio
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
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" ???
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
SunGray
2003-12-15 07:16:32 UTC
Permalink
Il navigatore Luca nello spazio di pensiero it.comp.java disse:

[cut]
Post by Luca
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
NomeClasse oggetti[] = new NomeClasse[10];
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?
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 @ ***@fastwebnet.it
See you space cowboy ...
Cristiano Sadun
2003-12-15 10:03:53 UTC
Permalink
Post by Luca
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
Pietro
2003-12-15 12:51:26 UTC
Permalink
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" ???
certo.
--
Pietro - http://www.pietroweb.tk
Linux Registered User #304991
Powered by *Mandrake GNU/Linux 9.2*
Loading...