Εδώ οι παράμετροι είναι primitive και περνάνε καθαρά by value (copy).
Αν η παράμετρος ήταν αντικείμενο (object), τότε περνά με αντιγραφή ο εσωτερικός δείκτης σε αυτό, αλλά όχι το ίδιο το αντικείμενο.
Επομένως η τροποποίηση
τοπικού αντιγράφου προφανώς δεν έχει καμία επίδραση εξωτερικά, αλλά όταν έχεις να κάνεις με εσωτερικό δείκτη, στην JAVA όσες φορές και να τον "αντιγράψεις", όλα τα αντίγραφα θα δείχνουν πάντα στο ίδιο αντικείμενο, και οι κλήσεις περνάνε απευθείας σε αυτό, άρα υπάρχει επίδραση.
Αν θες να περάσεις
γνήσιο αντίγραφο αντικειμένου, τότε θα κάνεις
κλωνοποίηση αυτού, ώστε ο νέος εσωτερικός δείκτης να δείχνει σε αντίγραφο του αντικειμένου και όχι στο original. Μεγάλη προσοχή σε αντικείμενα που μέσα τους εμπεριέχουν και άλλα αντικείμενα (π.χ. collections), όπου εκεί πλέον εισάγουμε τις έννοιες
shallow και
deep copy.
-------------------------------------------------------------------------------------------------------------------------------------
Σε
C++ (για του χρόνου
), αυτό:
Code: Select all
void something(int x, int y) { // Simple copy. (Damn, I lost the two suspects) }
είναι διαφορετικό από αυτό:
Code: Select all
// Pass by reference.
void something(int & x, int & y) { // Hmm, I see you x,y parameters, you can't hide. }
το οποίο είναι επίσης διαφορετικό (αλλά όχι εύκολα προφανές) από αυτό:
Code: Select all
// Welcome to the world of pointers.
void something(int *x, int *y) { // Crazy stuff, have fun :D }