Newsgroup: it.comp.java
Titolo: INFO OGGETTI JAVA

Sono da poco entrato nel mondo di Java e ho bisogno di un piccolo
chiarimento.
Qualcuno puň spiegarmi la differenza tra creare un oggetto e creare un
riferimento a un oggetto??
Esempio:
String Nome; Creo un riferimento ad un oggetto String
Nome1 = New String("Ciao!!"); Creo un oggetto String
Quali sono le differenze tra questi due esempi??O meglio..Quali funzioni in
piů puň svolgere un oggetto a differenza di un riferimento???
Grazie
Saluti
Andrea

 Grazie
visto che la materia è ampia, mi sembra che un'ottima introduzione agli
oggetti sia sul libro scaricabile da 
www.mokabyte.it
 
ciao!
Inviato da 
www.mynewsgate.net

 più può svolgere un oggetto a differenza di un riferimento???
Il "riferimento" (come tu lo chiami) non è che una variabile di tipo 
String, che in assenza di una assegnazione (inizializzazione) ad un 
oggetto valido è inutilizzabile. Come puoi facilmente verificare, java 
non ti consente nemmeno di utilizzare variabili non inizializzate.

> Il "riferimento" (come tu lo chiami) non č che una variabile di tipo
Guarda che si chiama proprio cosě ("riferimento"), la variabile č un'altra
cosa:
Con       int i;     dichiari una VARIABILE di tipo intero
Con       String s; dichiari un RIFERIMENTO A OGGETTO di tipo String ( o "un
riferimento di tipo String")...
in pratica un puntatore di tipo String.
La differenza c'č e si vede nel passaggio di parametri delle funzioni
i parametri primitivi sono solo parametri di ingresso
Quelli di tipo riferimento e gli array realizzano lo scambio dei parametri
"per puntatori"
(non "per riferimento")
bye.

 (non "per riferimento")
La terminologia non e' proprio cosi'. Citando la JLS
(
http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#18470
):
"A variable is a storage location and has an associated type, sometimes
called its compile-time type, that is either a primitive type (§4.2) or a
reference type (§4.3)."
Quindi con:
int i;
si definisce una variabile di tipo primitivo, cioe' che puo' contenere un
valore di un tipo primitivo, in questo caso di tipo int.
con:
String s;
anche in questo caso di sta definendo una variabile, ma in questo caso di
tipo reference, cioe' che puo' contenere un reference (riferimento) ad un
oggetto oppure il valore null. Nell'esempio, il reference e l'oggetto
devono essere di tipo String.
Quindi in entrambi i casi si sta definendo una variabile. La differenza
sta nei tipi di valore che possono contenere: la prima un valore di tipo
int, la seconda un valore di tipo riferimento (o piu' sempicemente "un
riferimento") a String.
Poi in pratica si usa semplicemente il termine "riferimento" sia per la
variabile, sia per il valore che essa puo' contenere, ma deve essere
chiaro dal contesto a quale dei due ci si intende riferire.
Per completare la terminologia, il passaggio di parametri in Java e'
SEMPRE "per valore", dove il valore nel caso di un parametro di tipo
primitivo e' appunto un valore di tipo primitivo, mentre nel caso di un
parametro di tipo riferimento e' un riferimento ad un oggetto.
-- 
Lucio Benfante
Java User Group Padova: 
http://www.jugpadova.it
Brainbench MVP for Java 1: 
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

realizzano lo scambio dei parametri "per puntatori"
(Fondamenti di Informatica - Savy     quindi ancora una volta non JLS)  da
un'informazione in più:
Visto che i due tipi di variabili contengono valori i cui tipi operano
rispettivamente a livelli di astrazione
diversi producono risultati diversi, infatti:
Se il parametro effettivo è una variabile di tipo primitivo in nessun modo
puoi modificare il contenuto della variabile esterna al metodo.
Se il parametro effettivo è una variabile di tipo riferimento,  il metodo
opera sulla medesima istanza referenziata sia all'interno del metodo che
all'esterno del metodo (Se ricordo bene a meno del tipo String). Ogni
modifica entro il metodo, pertanto, si riflette all'esterno.
Come sempre la comunicazione è piena di ambiguità e la prima cosa da fare
sarebbe specificare il contesto...mea culpa.
Povero Hilbert!
bye.

 riflette all'esterno.
No, non sono d'accordo. Le operazioni sui parametri operano esattamente
nella stessa maniera, sia che il parametro sia di tipo primitivo che di
tipo reference. In entrambi i casi, lavorando sul valore della variabile
otteniamo gli stessi risultati. Semplicemente, nel caso del tipo
reference, possiamo anche usare il valore della variabile per
dereferenziarlo ed accedere all'oggetto indicato...ma a questo punto non
stiamo piu' lavorando sulla variabile, bensi' sull'oggetto. La variabile
ed il suo valore non c'entrano piu' nulla.
Ciao
  Lucio


In Java :
-)
Le dichiarazioni di variabili primitive sono dichiarano variabili:
int a;
a e' una variabile
-)
Tutte le altre dichiarazioni dichiarano Pointers
Object o;
-)
La new instanzia un oggetto di una classe.
Fisicamente alloca della memoria sullo stack ( o nell' heap, non so se la VM
ha un heap )
e crea l'istanza di classe.
Assegna ad una variabile il Pointer alla nuova istanza.
String s;
s = new String("Cristiana");
s punta alla nuova istanza
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 s punta alla nuova istanza
n.n. forse prima dovresti leggerti i precedenti messaggi.
Inoltre, non offenderti ti prego, alcune cose che hai detto sono
banalmente sbagliate.
...curiosita'...da dove sarebbe spuntato fuori 'sto Pointer? ...mai
sentito in Java :-)
(hei...nota la faccina...sto scherzando, ripeto non offenderti)


 (hei...nota la faccina...sto scherzando, ripeto non offenderti)
Non vedo le faccine, posto da libero, comunque
riferimento e' la traduzione ufficiale di pointer da inglese a italiano.
e ha sempre creato confusione in informatica.
Prova a fare un system.out di un qualsiasi oggetto. Vedrai che avrai un
indirizzo di memoria, che si chiama da decine di anni Pointer
ho postato proprio per dirgli le stesse cose che avete detto voi in altri
termini. con questi concetti, a volte quasi filosofici, sentire + campane
puo' essere semplificativo, oppure ti spara nella confusione terminale he
he.
cya Nicola


 "variabile" è usato in contesti più generali di JAVA.
Non vorrei alimentare una polemica, ma non vedo il motivo del contendere 
sul termine "variabile" e questa mi sembra una arrampicata di specchi :-)
"Identificatore" non è un termine sinonimo o alternativo a "variabile". 
Come dice il termine stesso, l'identificatore è ciò che identifica, 
ovvero che da una identità, ovvero il nome. Indentifica cosa? Nel caso 
specifico la variabile.
In altre parole, l'identificatore è il nome che dai alla *variabile* 
quando scrivi il codice.
Ma a parte questo, il discorso è partito da una mia rettifica sul 
termine "riferimento" che hai contestato, dicendo che per gli oggetti 
"riferimento" è un termine opportuno rispetto a "variabile" facendo 
anche la similitudine con i puntatori. Java non consente accesso alla 
memoria, quindi parlare di "riferimento" e "puntatori" è sicuramente 
inopportuno.

 inopportuno.
come ho scritto sopra riferimento e' latraduzione inglese-italiano di
pointer. Java non consente l'indirizzamento diretto della memoria, ma ne
consente l'accesso, se no dove memorizzi.
Quindi non permette di assegnare o modificare il valore di un pointer, ma
questo resta un pointer lo stesso.
Fai il system.out di una variabile che punta a una istanza di classe e
vedrai il pointer
N


String[] lista = {};
questo ha qualche significato!?!?!?
in compilazione non da errori..

 terminale he he.
Veramente la questione era tutt'altro che filosofica, semplicemente
soprattutto terminologica.


 vedrai il pointer
Non diciamo fesserie.
L'output di System.out è il risultato del metodo toString() e il numero 
che vedi è l'hashCode() in esadecimale.

 soprattutto terminologica.
vero, forse pero' al il mittente originale serve anche un po' di filosofia
della OOP


 che vedi è l'hashCode() in esadecimale.
Qui n.n. ha una parte di ragione (per lo meno per qualche implementazione
della Java API), anche se non suffraga appieno le sue tesi.
Dal JavaDoc (quella Sun) di hashCode() di Object: "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".
In ogni caso un reference non e' un pointer.


 programming language".
No, Lucio, attento: manca il contesto di questa frase, perchè il "this" 
(soggetto) non è hashCode().
Il periodo completo è:
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.)
In altre parole; ti dice che l'implementazione di Object di hashCode() 
ritorna un intero NON univoco per oggetto, ed è *questo* che tipicamente 
  si otterrebbe convertendo in intero l'indirizzo interno. Inoltre 
sottolinea che il linguaggio Java (non specificatamente 
l'implementazione Sun) NON richiede che l'hashCode() degli oggetti sia 
univoco. Non mi sembra da questo si possa dedurre che alcune 
implementazioni di java potrebbero restituire l'internal address 
dell'oggetto, anche perchè per un efficiente funzionamento delle HashMap 
oggetti uguali dovrebbero ritornare hashCode uguali.

 filosofia della OOP
Addirittura la filosofia! Non credi sia sufficiente un po' di tecnica e
buona volonta'? ;-)
Ciao
  Lucio


Ad esempio, in quali contesti piu' generali e' usato?
Il concetto di variabile è utilizzato in algebra, con un significato che a
mio avviso è leggermente diverso. Ma questa è una mia opinione,
tu che ne pensi?
Ciao.

 (soggetto) non è hashCode().
Si, infatti avevo detto "una parte di ragione" :-)
...dai era solo perche' mi era sembrato di far notare troppe cose a n.n.
...ma si', dai che ognuno si difenda da se'...senza pieta'! :-) :-) :-)
for(;true;) System.out.print(":-) ");


 una locazione di memoria 
Alt! Ti fermo subito :-)
Non conosco le specifiche della jvm, ma le istanze degli oggetti sono in 
totale gestione della macchina virtuale e dubito fortemente che le 
variabili consentano (in qualche modo) l'accesso alla locazione di memoria.


Non credo sia inopportuno.
Inoltre, in generale, penso che sia buona cosa relazionare concetti
appartenenti a contesti separati, anche se genera confusione.
Infatti, fortunatamente, istaurando un dibattito ognuno propone il suo punto
di vista ( corretto o meno, preciso o meno) e ciò aumenta la conoscenza
dell'argomento ad almeno una persona  afferente al dibattito...... in questo
caso IO. :)

 tu che ne pensi?
In algebra e' totalmente diverso.
...avevo capito che in Java era usato in contesti piu' generali. :-)


 ...ma si', dai che ognuno si difenda da se'...senza pieta'! :-) :-) :-)
Per ultimo spero che non dibattiate per difendere le vostre posizioni a
oltranza. cosa alquanto stupida, orgogliosa e che porta a rimanere sempre
allo stesso punto.
Spero che dibattiate per chiarire, per completare, per migliorare
Buon lavoro e buona settimana a entrambi.
Nicola


Ho controllato sul testo di riferimento...
Java Manuale ufficiale - seconda ed. italiana
K. Arnold - J. Gosling - D. Holmes
...sto proprio invecchiando... non c'era assolutamente scritto
IDENTIFICATORE!!
Scusatemi per il mega-abbaglio!!
...c'è da preoccuparsi!! ;)

 hashCode uguali.
Scusa Vincent, ma a meno che tu non abbia sbagliato nel riportare il testo
in inglese, la mia traduzione è molto diversa dalla tua:
"... Il metodo hashCode della classe Object ritorna interi diversi per
oggetti diversi", ---- il che IMHO è come dire che identifica in modo
univoco ogni oggetto ---- "( E questo è tipicamente implementato convertendo
l'indirizzo interno di ogni oggetto in un intero, tuttavia questa
implementazione non è richiesta dal linguaggio ...."
A meno che il mio inglese non abbia bisogno di una rinfrescata, ciò è quasi
esattamente l'opposto di ciò che tu sostieni ... !
Ma a parte questo, la discussione è interessante e me la sono proprio
gustata.
Ho imparato qualcosa, se non altro che ci sono sempre tanti modi di vedere
un problema ed anche se uno è convinto di sapere dove sta la ragione,
ascoltare le opinioni di altri talvolta apre nuove prospettive.
Devo dire che io personalmente preferisco l'approccio di Lucio a quello di
n.n. ... ma è un'opinione come un'altra.
Vediamo se qualcuno è d'accordo con questo mio modo di vedere la questione
...
Java e la JVM sono due elementi che stanno fra loro come, 
p.es
.. il C sta
alla CPU che ne esegue il codice compilato ...
non a caso JVM sta per Java Virtual Machine, cioè per una CPU virtuale,
realizzata in sw invece che di silicio.
In quest'ottica, il contenuto di una variabile Java di tipo reference è
l'analogo di un reference in C o C++, con la differenza che quello che in C
è un indirizzo di memoria della CPU (cioè assimilabile a un indirizzo fisico
della memoria), in Java è l'indirizzo di una 'locazione di memoria' della
JVM, qualunque cosa essa sia in realtà.
Bisogna quindi badare a non confondere a vanvera i due livelli di
astrazione, JVM da un lato, CPU fisica dall'altro. I paralleli e le analogie
sono utili a visualizzare e comprendere meglio i concetti, ma non se ne deve
abusare.
Per finire sono assolutamente certo che reference e pointer sono concetti
legati fra loro ma ben distinti: in Java il primo non è definito, in C un
pointer è una variabile destinata a contenere un reference.
Se proprio si vuole, credo che nel seguente statement Java:
MioOggetto obj = new MioOggetto();
obj possa essere 'pensato' come un 'constant pointer' ad un oggetto di tipo
MioOggetto, giusto per aiutare un programmatore C o C++ a visualizzare il
concetto ... ma non di più.
saluti a tutti