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 аст
// Объекти нав, ки дар reassignObject сохта шудааст, аз берун дастрас нест

Хулоса, Java ҳамеша бо арзиш гузаронида мешавад, аммо барои намудҳои истинодӣ, арзиши истинод нусхабардорӣ мешавад, на худи объект.