[Java]passaggio parametro

di il
10 risposte

[Java]passaggio parametro

Salve a tutti, mi è capitato di vedere alcune classi Java dove vengono passati oggetti come parametri, ad es.

public class ServiziAuto {
public static void verniciatura(Auto auto, String colore) {


Auto auto

Vorrei capire perché il parametro viene passato così, qualcuno può spiegarmi il funzionato?

10 Risposte

  • Re: [Java]passaggio parametro

    Vorrei capire perché il parametro viene passato così, qualcuno può spiegarmi il funzionato?
    Cosa di preciso non ti è chiaro? In questo modo possiamo darti una risposta precisa.
  • Re: [Java]passaggio parametro

    bassanio69 ha scritto:


    Vorrei capire perché il parametro viene passato così, qualcuno può spiegarmi il funzionato?
    In che senso "così"? Un parametro di metodo/costruttore può essere di tipo "primitivo" o "reference" ... esattamente come per qualunque altra variabile lecita.
    Il passaggio degli argomenti è sempre per "valore". Per un valore primitivo, il parametro (che è sostanzialmente una variabile "locale" al metodo) riceve una copia dei bit che rappresentano il valore. Per un reference, il parametro riceve una copia dei bit del reference, che è comunque un valore.
  • Re: [Java]passaggio parametro

    Nel senso che ho sempre è solo utilizzato parametri di tipo string int double boolean, mentre vedendo quell'esempio viene utilizzato un parametro di tipo oggetto, vorrei capire cosa cambia
  • Re: [Java]passaggio parametro

    bassanio69 ha scritto:


    Nel senso che ho sempre è solo utilizzato parametri di tipo string int double boolean, mentre vedendo quell'esempio viene utilizzato un parametro di tipo oggetto, vorrei capire cosa cambia
    Cambia nulla. Anche String è un oggetto. Quindi se sai passare un String ... sai anche passare qualunque altro tipo reference.
  • Re: [Java]passaggio parametro

    Ripropongo la domanda in modo più corretto, come funziona il passaggio di parametri per riferimento? E qual'è la differenza con i passaggio per valore?
  • Re: [Java]passaggio parametro

    bassanio69 ha scritto:


    come funziona il passaggio di parametri per riferimento? E qual'è la differenza con i passaggio per valore?
    In Java il passaggio di argomenti a metodi/costruttori è sempre e solo per valore. Se passi un tipo primitivo, passi una copia del valore che è composto dagli N bit specifici del tipo (es. 32 bit per un int). Se passi un tipo reference, passi una copia del valore del reference che sono quei tot bit che rappresentano una sorta di "puntatore" all'oggetto (e nota: NON passi una copia dell'oggetto!).

    La differenza tra reference rispetto ai primitivi è che un reference:
    a) non sai quanti bit occupa in memoria (dipende da diversi fattori: implementazione della JVM, sistema operativo/piattaforma).
    b) non puoi "stamparne" il valore.
    c) non puoi farci alcuna aritmetica (la ben nota "aritmetica dei puntatori" che invece esiste in C/C++).

    Quindi per il programmatore Java un reference è normalmente qualcosa di molto "opaco", sai solo che: o fa riferimento ad un oggetto oppure vale null. Non ci sono altre possibilità.
    Ma è comunque alla fine un valore. E quando lo passi ad un metodo/costruttore, esso riceve una copia di quel valore.
  • Re: [Java]passaggio parametro

    @andbin, c'e' un problema semantico, in inglese riferimento si dice reference.
    Solo i tipi primitivi vengono passati per valore, tutto il resto per reference, nel senso che se modifichi l'oggetto (non primitivo), tutti quelli che hanno il suo reference vedono la modifica.

    Ora, se ci si ricorda che il reference non e' altro che un puntatore, fondamentalmente un intero usato in modo speciale, ecco che il reference (cioe' il puntatore) essendo un tipo primitivo, viene passato per valore.
  • Re: [Java]passaggio parametro

    In Java il passaggio è sempre per VALORE.

    Da "The Java™ Programming Language, 4th Edition" - Addison-Wesley Professional, pag. 63:
    All parameters to methods are passed "by value". In other words, values of parameter variables in a method are copies of the values the invoker specified as arguments.


    http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value/40523#40523
  • Re: [Java]passaggio parametro

    @andbin: non devi spiegarlo a me, devi spiegarlo a bassanio
    Se ci pensi, la stessa cosa funziona per il C++ (ed il C), un passaggio per reference non e' una cosa miracolosa! E' sempre il puntatore che passi! E lo passi (il puntatore) per valore!
    E ache quando passi esplicitamente un puntatore, lo passi per valore.
  • Re: [Java]passaggio parametro

    bassanio69 ha scritto:


    ripropongo la domanda in modo più corretto, come funziona il passaggio di parametri per riferimento? E qual'è la differenza con i passaggio per valore?
    Forse cosi' lo capisci meglio:

    il passaggio di un parametro per valore vuol dire che passi una copia del parametro alla funzione/metodo chiamata.

    Se questa funzione cambia il valore del paramero o di una sua parte questa modifica non e' visibile all'esterno ed in particolare alla funzione/metodo chiamante. Perche', appunto, sta' lavorando su una copia diversa dall'originale.

    Ora fino a che ragioni in termini di intero, float, byte, il concetto e' abbastanza semplice, perche' ci sono pochi byte da copiare (1,2,4,8).

    Ma immagina di avere una struttura dati che usa UN MEGABYTE di memoria, se la devi passare per valore, devi creare una sua copia che occupa, ovviamente, UN MEGABYTE.

    Per l'oggetto String la questione e' un po' (decisamente) piu' subdola, ma ci arriviamo fra un po'.

    Se passi un parametro per reference vuol dire che non passi una copia del parametro, ma un riferimento (reference,, appunto) al parametro. In altri termini, quandi usi quel parametro, stai accedendo all'oggetto originale!

    Nel caso dell'oggetto da UN MEGABYTE, se lo passi per reference, devi passare SOLO OTTO BYTE! Un miglioramento non da poco

    Cosa succede se modifichi un l'oggetto passato per reference, o una sua parte? Che, quando esci dalla funzione/metodo, la funzione/metodo chiamante vede le modifiche apportate. Perche' l'oggeto su cui ha agito la funzione/metodo chiamata, e' sempre lo stesso.

    Alcuni oggetti hanno una semantica particolare: sono immutabili cioe' non possono essere modificati!

    E' il caso della stringa, che viene passata per reference, ma non potendo modificarla, l'unico modo e' quello di creare un'altra stringa.
    Conseguenza, anche se la stringa e' passata per reference, non potendo essere modificata, e' come se fosse passata per valore.

    Se, invece della stringa, passi un StringBuffer, che puo' essere modificato (basta fare un'append), vedi che si ritorna al discorso di partenza.

    Perche' non si passa un oggetto per valore?

    E' una specifica decisione progettuale del linguaggio. A a che fare con diverse questioni abbastanza complicate, tra cui l'uso del garbage collector.

    Un linguaggio in cui puoi decidere se passare un parametro per reference o per valore (ma anche qui ci sono dettagli abbastanza sobdoli da considerare) e' il C++.

    Anche se in Java non hai accesso ai puntatori, non puoi applicare l'aritmetica dei puntatori, questo non ti risparmia dal fatto di capire che cosa sono i puntatori. Un reference in fatti, non e' altro che un puntatore
Devi accedere o registrarti per scrivere nel forum
10 risposte