piccoli quiz

2 views
Skip to first unread message

Walter Collazzo

unread,
Dec 12, 2009, 2:45:15 AM12/12/09
to jug...@googlegroups.com
Molti di voi ricorderanno il VB.
In quel linguaggio di poteva passare una variabile alla procedura byref e byvalue con sinificato intuitivo di per riferimento (puntatore) o per copia.
 
 
In Java non esistono puntatori espliciti, ma internamente sì.
 
Qualcuno sa (credo tutti, ma non è scontato) come viene passata in java una variabile al metodo?
Per riferimento (puntatore), per copia, o altro?

Marco Ronchetti

unread,
Dec 12, 2009, 2:59:04 AM12/12/09
to jug...@googlegroups.com
Le variabili primitive (int, double...) vengono passate per copia (by
value), gli oggetti per riferimento (viene passato per copia il
riferimento, ovvero puntatore).

vedi http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html

Per completezza, aggiungiamo che però usando oggetti distribuiti (RMI)
anche gli oggetti stessi vengono copiati (e quindi devono essere
serializzabili) a meno che non siano essi stessi degli oggetti remoti,
nel qual caso viene passata una remote reference.

Ciao

Marco
> --
>
> 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.
>



--
Marco Ronchetti - Dipartimento di Ingegneria e Scienza dell'Informazione
Universita' degli Studi di Trento - 38123 Povo (TN) Italy
tel: (+39)0461 282033 mob: (+39)335 6006343 fax (+39)0461 282093
http://latemar.science.unitn.it

Marco Moser

unread,
Dec 14, 2009, 11:55:40 AM12/14/09
to jug...@googlegroups.com
occhio che String, Integer, Float ... sono oggetti immutabili: vengono
passati by ref ma non si possono modificare

my 2 cents



Il 12/12/2009 8.59, Marco Ronchetti ha scritto:
> Le variabili primitive (int, double...) vengono passate per copia (by
> value), gli oggetti per riferimento (viene passato per copia il
> riferimento, ovvero puntatore).
>
> vedi http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html
>
> Per completezza, aggiungiamo che per� usando oggetti distribuiti (RMI)
> anche gli oggetti stessi vengono copiati (e quindi devono essere
> serializzabili) a meno che non siano essi stessi degli oggetti remoti,
> nel qual caso viene passata una remote reference.
>
> Ciao
>
> Marco
>
> Il 12 dicembre 2009 08.45, Walter Collazzo<walte...@inwind.it> ha scritto:
>
>> Molti di voi ricorderanno il VB.
>> In quel linguaggio di poteva passare una variabile alla procedura byref e
>> byvalue con sinificato intuitivo di per riferimento (puntatore) o per copia.
>>
>>
>> In Java non esistono puntatori espliciti, ma internamente s�.
>>
>> Qualcuno sa (credo tutti, ma non � scontato) come viene passata in java una
>> variabile al metodo?
>> Per riferimento (puntatore), per copia, o altro?
>>
>> --
>>
>> 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.
>>
>>
>
>
>


--
/* http://www.marcomoser.it mailto:ma...@marcomoser.it skype:marco1.moser?call phone:3470793068 */

Marco Ronchetti

unread,
Dec 14, 2009, 1:00:32 PM12/14/09
to jug...@googlegroups.com
Ottimo punto, Marco. E' uno dei casi in cui la ricerca di efficienza
ha portato a un comportamento non uniforme del linguaggio (cosa che a
me pare piuttosto deprecabile). Infatti il seguente codice non ritorna
pippo - pluto - pluto come sarebbe lecito aspettarsi, ma pippo -
pluto - pippo.

public class NewClass {
public static void main(String a[]){
new NewClass();
}
NewClass() {
String s="pippo";
f(s);
System.out.println(s);
}
void f(String k){
System.out.println(k);
k="pluto";
System.out.println(k);
}
}

In questo senso String (ma anche i vari wrapper, come ti dici), pur
essendo un Object, si comporta come una variabile primitiva.
Ciao

Marco R.

Il 14 dicembre 2009 17.55, Marco Moser <ma...@marcomoser.it> ha scritto:
> occhio che String, Integer, Float ... sono oggetti immutabili: vengono
> passati by ref ma non si possono modificare
>
> my 2 cents
>
>
>
> Il 12/12/2009 8.59, Marco Ronchetti ha scritto:
>> Le variabili primitive (int, double...) vengono passate per copia (by
>> value), gli oggetti per riferimento (viene passato per copia il
>> riferimento, ovvero puntatore).
>>
>> vedi http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html
>>
>> Per completezza, aggiungiamo che però usando oggetti distribuiti (RMI)
>> anche gli oggetti stessi vengono copiati (e quindi devono essere
>> serializzabili) a meno che non siano essi stessi degli oggetti remoti,
>> nel qual caso viene passata una remote reference.
>>
>> Ciao
>>
>> Marco
>>
>> Il 12 dicembre 2009 08.45, Walter Collazzo<walte...@inwind.it>  ha scritto:
>>
>>> Molti di voi ricorderanno il VB.
>>> In quel linguaggio di poteva passare una variabile alla procedura byref e
>>> byvalue con sinificato intuitivo di per riferimento (puntatore) o per copia.
>>>
>>>
>>> In Java non esistono puntatori espliciti, ma internamente sì.
>>>
>>> Qualcuno sa (credo tutti, ma non è scontato) come viene passata in java una
>>> variabile al metodo?
>>> Per riferimento (puntatore), per copia, o altro?
>>>
>>> --
>>>
>>> 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.
>>>
>>>
>>
>>
>>
>
>
> --
> /* http://www.marcomoser.it mailto:ma...@marcomoser.it skype:marco1.moser?call phone:3470793068 */
>
> --
>
> 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.
>
>
>



--

Simone Bordet

unread,
Dec 14, 2009, 3:37:26 PM12/14/09
to jug...@googlegroups.com
Ciao,

2009/12/14 Marco Ronchetti <marco.r...@unitn.it>:
> Ottimo punto, Marco. E' uno dei casi in cui la ricerca di efficienza
> ha portato a un comportamento non uniforme del linguaggio (cosa che a
> me pare piuttosto deprecabile). Infatti il seguente codice non ritorna
> pippo - pluto - pluto come sarebbe lecito aspettarsi, ma  pippo -
> pluto - pippo.
>
> public class NewClass {
>    public static void main(String a[]){
>        new NewClass();
>      }
>    NewClass() {
>        String s="pippo";
>        f(s);
>        System.out.println(s);
>    }
>    void f(String k){
>        System.out.println(k);
>        k="pluto";
>        System.out.println(k);
>    }
> }
>
> In questo senso String (ma anche i vari wrapper, come ti dici), pur
> essendo un Object, si comporta come una variabile primitiva.

Non è esatto.
Il reference k viene passato by value, come ogni reference in Java.
Non c'entra nulla il fatto che sia String o un wrapper di tipi primitivi.

Simon
--
http://bordet.blogspot.com
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless. Victoria Livschitz

Marco Ronchetti

unread,
Dec 14, 2009, 4:13:43 PM12/14/09
to jug...@googlegroups.com
Hai ragione! Ho preso una cotica...

Infatti k="pluto"; è equivalente a k=new String("pluto"); e quindi
ovviamente sovrascrive l'identificatore locale k senza avere side
effects nel chiamante, mentre la sintassi (comoda ma un po fuorviante)
potrebbe suggerire una sorta di "assegna a k il valore 'pluto'", come
se la semantica fosse una sorta di k.setString("pippo") - che
ovviamente non esiste.

... grazie per avermi corretto!

M
Reply all
Reply to author
Forward
0 new messages