Sobes.tech
Junior

Πώς μεταβιβάζονται οι μεταβλητές στις μεθόδους;

sobes.tech AI

Απάντηση από AI

Στην Java, οι μεταβλητές περνούνται στις μεθόδους με τιμή.

Αυτό σημαίνει ότι, κατά την κλήση μιας μεθόδου, δημιουργείται ένα αντίγραφο της τιμής της μεταβλητής, και αυτό το αντίγραφο περνάει στη μέθοδο. Οι αλλαγές που γίνονται στην παράμετρο μέσα στη μέθοδο επηρεάζουν μόνο αυτό το αντίγραφο και δεν επηρεάζουν την αρχική μεταβλητή.

Για τους πρωταρχικούς τύπους δεδομένων (int, float, boolean κ.λπ.), περνάει η άμεση τιμή.

// Πρωταρχικός τύπος δεδομένων
int a = 10;

void changeValue(int x) {
  x = 20; // Το αντίγραφο αλλάζει, όχι η αρχική μεταβλητή 'a'
}

changeValue(a);
// Μετά την κλήση της μεθόδου, το 'a' παραμένει 10

Για τους τύπους δεδομένων αναφοράς (αντικείμενα, πίνακες), περνάει ένα αντίγραφο της αναφοράς στο αντικείμενο. Η ίδια η αναφορά αντιγράφεται, αλλά και οι δύο αναφορές δείχνουν στο ίδιο αντικείμενο στη μνήμη. Οι αλλαγές στην κατάσταση του αντικειμένου, που γίνονται μέσα στη μέθοδο μέσω της μεταβλητής αναφοράς, θα φαίνονται έξω από τη μέθοδο. Ωστόσο, η επαναπροσδιορισμός της αναφοράς μέσα στη μέθοδο δεν επηρεάζει την αρχική αναφορά.

// Τύπος αναφοράς
class MyObject {
    int value;
}

MyObject obj = new MyObject();
obj.value = 10;

void changeObjectValue(MyObject o) {
  o.value = 20; // Αλλάζει την κατάσταση του αντικειμένου, ορατό από έξω
}

void reassignObject(MyObject o) {
  o = new MyObject(); // Αναθέτει ξανά την τοπική αναφορά, δεν επηρεάζει το 'obj'
  o.value = 30;
}

changeObjectValue(obj);
// Μετά την κλήση, το obj.value είναι 20

reassignObject(obj);
// Μετά την κλήση, το 'obj' εξακολουθεί να δείχνει στο ίδιο αντικείμενο, και το obj.value είναι 20
// Το νέο MyObject που δημιουργήθηκε μέσα στη reassignObject δεν είναι προσβάσιμο από έξω

Συνοπτικά, η Java χρησιμοποιεί πάντα την παράδοση με τιμή, αλλά για τους τύπους αναφοράς, αντιγράφεται η τιμή της αναφοράς, όχι το ίδιο το αντικείμενο.