Costruttori e distruttori

34 views
Skip to first unread message

nicola trentin

unread,
Jan 17, 2012, 3:53:05 AM1/17/12
to jug...@googlegroups.com
Buongiorno a tutti.
Sto studiando i costruttori e i distruttori Java e però non mi sono molto chiari.
Correggetemi se sbaglio.
I costruttori servono ad inizializzare un oggetto, mentre i distruttori, come suggerisce il nome, servono a distruggere l’oggetto. I costruttori sono dei normalissimi metodi giusto? che vengono chiamati automaticamente quando creo un nuovo oggetto. Se mi creo il mio costruttore per chiamarlo quando creo il nuovo oggetto devo chiamarlo come un normale metodo?
 
Grazie a tutti. Probabilmente aggiungerò altro + tardi B-)
Buona giornata.
 
Nicola Trentin

Mario Alexandro Santini

unread,
Jan 17, 2012, 4:16:44 AM1/17/12
to jug...@googlegroups.com


2012/1/17 nicola trentin <trenti...@hotmail.it>

Buongiorno a tutti.
Sto studiando i costruttori e i distruttori Java e però non mi sono molto chiari.
Correggetemi se sbaglio.
I costruttori servono ad inizializzare un oggetto, mentre i distruttori, come suggerisce il nome, servono a distruggere l’oggetto. I costruttori sono dei normalissimi metodi giusto? che vengono chiamati automaticamente quando creo un nuovo oggetto. Se mi creo il mio costruttore per chiamarlo quando creo il nuovo oggetto devo chiamarlo come un normale metodo?
 

Il costruttore è un metodo speciale dell'oggetto che viene invocato quando si crea l'oggetto.

Siccome puoi definire più costruttori, il costruttore che chiami è definito dagli argomenti che gli passi.

Esempio:

class A {

private String aVal;

 public A() {
   this.aVal = null;
 }

 public A(String val) {
  this.aVal = val;
 }

class TestA {
 public void main(String[] args) {
  A myA = new A();
  A myB = new A("Ciao");
 }

}

Nella prima riga si usa il costruttore vuoto, nella seconda quello con l'argomento.

Attenzione, se non definisci un costruttore, viene utilizzato uno vuoto di default.

Se definisci un costruttore con degli argomenti, non puoi usare il costruttore vuoto, a meno che non lo definisci esplicitamente.

Ogni costruttore chiama implicitamente il costruttore di default della classe padre.

In merito al distruttore, devo dire di non averlo mai utilizzato.
In Java non è molto importante, perché gli oggetti in memoria sono gestiti dal garbage collector. 

lo scopo di un distruttore è quello di liberare la memoria allocata dall'oggetto istanziato qualora non serva più.
Quindi il programmatore decide quando liberarsi di un oggetto e chiama il suo distruttore per liberare la memoria.

In Java ci pensa il garbage collector, e quindi il programmatore non sa in quale momento l'oggetto non più utilizzato sarà distrutto.

E' possibile forzare l'operazione di garbage collection da programma, ma non è molto utilizzata come strategia.

E siccome la memoria in java è allocata da oggetti, liberando man mano gli oggetti non più utilizzati il garbage collector effettua tutto il lavoro da solo.

Ma su questa parte è meglio la conferma di qualcuno più preparato di me. :)



Grazie a tutti. Probabilmente aggiungerò altro + tardi B-)
Buona giornata.
 
Nicola Trentin

--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To post to this group, send email to jug...@googlegroups.com.
To unsubscribe from this group, send email to jugtaa+un...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/jugtaa?hl=en.



--
Ciao,
      Mario

nicola trentin

unread,
Jan 17, 2012, 4:20:03 AM1/17/12
to jug...@googlegroups.com
Grazie mille =)
To unsubscribe from this group, send email to mailto:jugtaa%2Bunsu...@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/jugtaa?hl=en.

nicola trentin

unread,
Jan 17, 2012, 7:43:18 AM1/17/12
to jug...@googlegroups.com
Aggiungo un’altra domanda:
 
Gli identificatori sono le handle??

Mario Alexandro Santini

unread,
Jan 17, 2012, 8:02:04 AM1/17/12
to jug...@googlegroups.com


2012/1/17 nicola trentin <trenti...@hotmail.it>

Aggiungo un’altra domanda:
 
Gli identificatori sono le handle??
 

Scusa ma non mi è chiara la domanda, potresti spiegarti un po' meglio?



--
Ciao,
      Mario

nicola trentin

unread,
Jan 17, 2012, 8:05:42 AM1/17/12
to jug...@googlegroups.com
In java non esistono, almeno esplicitamente, i puntatori. In c++ i puntatori avevano delle handle (maniglie) che permettevano di accedere ai puntatori. Quello che non ho capito è cosa sono gli identificatori in java. Grazie=)
 
Sent: Tuesday, January 17, 2012 2:02 PM
Subject: Re: [JUGTAA] Costruttori e distruttori
 

Mario Alexandro Santini

unread,
Jan 17, 2012, 8:12:35 AM1/17/12
to jug...@googlegroups.com


2012/1/17 nicola trentin <trenti...@hotmail.it>

In java non esistono, almeno esplicitamente, i puntatori. In c++ i puntatori avevano delle handle (maniglie) che permettevano di accedere ai puntatori. Quello che non ho capito è cosa sono gli identificatori in java. Grazie=)
 

Ecco. :)

In Java, come dici bene tu i puntatori non esistono.



 
Sent: Tuesday, January 17, 2012 2:02 PM
Subject: Re: [JUGTAA] Costruttori e distruttori
 


2012/1/17 nicola trentin <trenti...@hotmail.it>
Aggiungo un’altra domanda:
 
Gli identificatori sono le handle??
 
 
Scusa ma non mi è chiara la domanda, potresti spiegarti un po' meglio?
 
 
 
--
Ciao,
      Mario
--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To post to this group, send email to jug...@googlegroups.com.
To unsubscribe from this group, send email to jugtaa+un...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/jugtaa?hl=en.

--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To post to this group, send email to jug...@googlegroups.com.
To unsubscribe from this group, send email to jugtaa+un...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/jugtaa?hl=en.



--
Ciao,
      Mario

nicola trentin

unread,
Jan 17, 2012, 8:16:02 AM1/17/12
to jug...@googlegroups.com
Grazie =)
 
Sent: Tuesday, January 17, 2012 2:12 PM
Subject: Re: [JUGTAA] Costruttori e distruttori
 
2012/1/17 nicola trentin <trenti...@hotmail.it>
In java non esistono, almeno esplicitamente, i puntatori. In c++ i puntatori avevano delle handle (maniglie) che permettevano di accedere ai puntatori. Quello che non ho capito è cosa sono gli identificatori in java. Grazie=)
 
 
Ecco. :)
 
In Java, come dici bene tu i puntatori non esistono.
 
 
 
 
Sent: Tuesday, January 17, 2012 2:02 PM
Subject: Re: [JUGTAA] Costruttori e distruttori
 
 
 
2012/1/17 nicola trentin <trenti...@hotmail.it>
Aggiungo un’altra domanda:
 
Gli identificatori sono le handle??
 
 
Scusa ma non mi è chiara la domanda, potresti spiegarti un po' meglio?
 
 
 
--
Ciao,
      Mario
--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To post to this group, send email to jug...@googlegroups.com.
To unsubscribe from this group, send email to mailto:jugtaa%2Bunsu...@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/jugtaa?hl=en.
--
You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
To post to this group, send email to jug...@googlegroups.com.
To unsubscribe from this group, send email to mailto:jugtaa%2Bunsu...@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/jugtaa?hl=en.


 
--
Ciao,
      Mario

Roberto Resoli

unread,
Jan 19, 2012, 5:33:06 AM1/19/12
to jug...@googlegroups.com
Il 17 gennaio 2012 14:12, Mario Alexandro Santini
<alexm...@gmail.com> ha scritto:
...

> In Java, come dici bene tu i puntatori non esistono.

Spesso si dice che i puntatori esistono, ma non possono essere gestiti
esplicitamente.

Un qualsiasi oggetto è in realtà accessibile solo come puntatore, e
quindi ad esempio passare un'oggetto come parametro non passa
l'oggetto in sè (by value),
ma solo il suo riferimento, in maniera esattamente equivalente al
passaggio "by reference" in C/C++.

Questo spiega perchè, se a e b sono oggetti istanze di una certa
classe, contenente un membro intero m:

a.m = 0;
b.m = 0;

b = a;
a.m = 1;

... contrariamente a quanto ci si potrebbe aspettare, anche b.m vale 1.

In altri termini, l'operazione b = a non rende b uguale a, ma rende il
"riferimento a b" uguale al "riferimento ad a".
L'operazione non copia gli oggetti, ma i riferimenti. Qundi dopo di
essa a e b sono esattamente lo stesso oggetto, non oggetti distinti ma
uguali.

Il riferimento all'oggetto b è perso (se non era copiato altrove),
così come la possibilità di accedere ai dati referenziati, che sono
così
disponibili per la garbage collection.

Anche se non sono manipolabili direttamente, qualcosa di correlato
(l'"hascode" dell'oggetto) è visualizzabile con un semplice print
(se gli oggetti in questione non fanno override del metodo toString()
ereditato da Object ).

"As much as is reasonably practical, the hashCode method defined by
class Object does return distinct integers for distinct objects. (This
is typically implemented by converting the internal address of the
object into an integer, but this implementation technique is not
required by the JavaTM programming language.)"

Un paio di link interessanti:

http://mindprod.com/jgloss/reference.html
http://csis.pace.edu/~bergin/papers/JavaPointerTraps.html

ciao,
rob

Tiziano Lattisi

unread,
Jan 19, 2012, 5:44:04 AM1/19/12
to jug...@googlegroups.com
Aggiungo un piccolo dettaglio alla bella spiegazione di Roberto.
Quando si afferma che Java non può "gestire esplicitamente" un puntatore,
e quindi spesso si afferma impropriamente che non ha puntatori, ci si
riferisce al fatto che non è possibile farsi restituire l'indirizzo di memoria
in cui risiede una data risorsa, per poterlo manipolare.

In C, ad esempio, è possibile da un puntatore recuperare il suo indirizzo
(tramite l'anteposizione della &). Se ad esempio il puntatore è ad un tipo
di dato char, mi è possibile incrementare il valore del suo indirizzo di 1 byte
e accedere al "char successivo" di una stringa.
A dire il vero è anche possibile con estrema facilità uscire alla lunghezza
della mia stringa e andare a leggere (o scrivere!) per sbaglio chissà
che cosa... :-P

ciao
t.

> --
> You received this message because you are subscribed to the Google Groups "JUG Trentino Alto Adige Suedtirol" group.
> To post to this group, send email to jug...@googlegroups.com.
> To unsubscribe from this group, send email to jugtaa+un...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/jugtaa?hl=en.
>

--
-- Tiziano Lattisi

Roberto Resoli

unread,
Jan 19, 2012, 5:53:00 AM1/19/12
to jug...@googlegroups.com
Il 19 gennaio 2012 11:44, Tiziano Lattisi <tiziano...@gmail.com>
ha scritto:

> Aggiungo un piccolo dettaglio alla bella spiegazione di Roberto.
> Quando si afferma che Java non può "gestire esplicitamente" un puntatore,
> e quindi spesso si afferma impropriamente che non ha puntatori, ci si
> riferisce al fatto che non è possibile farsi restituire l'indirizzo di memoria
> in cui risiede una data risorsa, per poterlo manipolare.

Esatto, e su questo si basa tutta l'aritmrtica dei puntatori che ad
esempio permette di scorrere
un'array incrementando semplicemente l'indirizzo del suo puntatore, molto
"svelto e sporco", ma sono felice che non sia possibile in java ;.)

> In C, ad esempio, è possibile da un puntatore recuperare il suo indirizzo
> (tramite l'anteposizione della &). Se ad esempio il puntatore è ad un tipo
> di dato char, mi è possibile incrementare il valore del suo indirizzo di 1 byte
> e accedere al "char successivo" di una stringa.


naturalmente cose similari puoi fare in java con gli operatori di
"shift" e bitwise conditional ...
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

> A dire il vero è anche possibile con estrema facilità uscire alla lunghezza
> della mia stringa e andare a leggere (o scrivere!) per sbaglio chissà
> che cosa... :-P

eh già. Oppure allocare aree di memoria tramite malloc() senza
bilanciarle sempre con un free()
quando non servono più ...
Facilissimi i memory leak in C C++, anche se ci si può ingegnare di
crearne di bellissimi anche in Java ;-) .

ciao
rob

Tiziano Lattisi

unread,
Jan 19, 2012, 5:59:40 AM1/19/12
to jug...@googlegroups.com
> Facilissimi i memory leak in C C++, anche se ci si può ingegnare di
> crearne di bellissimi anche in Java ;-) .

Anche a me non dispiace che in Java sia più difficile spararsi su un piede. :-D

Roberto Resoli

unread,
Jan 19, 2012, 6:02:38 AM1/19/12
to jug...@googlegroups.com
Il 19 gennaio 2012 11:53, Roberto Resoli <roberto...@gmail.com> ha scritto:
...

>> In C, ad esempio, è possibile da un puntatore recuperare il suo indirizzo
>> (tramite l'anteposizione della &).

infatti per chi come me ha iniziato a lavorare in C, risulta comodo
pensare gli le variabili java di tipo oggetto come se avessero
sempre davanti un & invisibile ... oppure fossero proprio dei puntatori.

rob

Roberto Resoli

unread,
Jan 19, 2012, 6:11:19 AM1/19/12
to jug...@googlegroups.com
2012/1/19 Tiziano Lattisi <tiziano...@gmail.com>:

>> Facilissimi i memory leak in C C++, anche se ci si può ingegnare di
>> crearne di bellissimi anche in Java ;-) .
>
> Anche a me non dispiace che in Java sia più difficile spararsi su un piede. :-D

A beh, anche se tu ci riesci, magari ci pensano altri a spararti,
succede anche per classi standard java ...

qui c'è una rassegna:

http://stackoverflow.com/questions/1281549/memory-leak-traps-in-the-java-standard-api

In generale bisogna stare *molto* attenti alle classi e variabili
dichiarate static, e ai riferimenti alle stesse.

rob

Reply all
Reply to author
Forward
0 new messages