JavaRush /Java blogi /Random-UZ /Java-da parametrlarni o'tkazish
vincent_vega
Daraja
Gainesville

Java-da parametrlarni o'tkazish

Guruhda nashr etilgan
Java-dagi o'zgaruvchi - bu undagi qiymatga ega konteyner. Xo'sh, o'zgaruvchini "o'tkazish" nimani anglatadi? Va ibtidoiy va mos yozuvlar ma'lumotlar turlari o'rtasidagi farq nima.
Java-da parametrlarni o'tkazish - 1
Bunga keyinroq kelamiz. Avval oddiy topshiriqdan boshlaylik. Ushbu kod nima qiladi:
int х = 3;
int у = х;
1-satrda int tipidagi x o'zgaruvchi yaratiladi va unga 3-qiymat beriladi. 2-satrda int tipidagi y o'zgaruvchi yaratiladi va unga x o'zgaruvchining qiymati beriladi . Kelajakda x o'zgaruvchisi y ga hech qanday ta'sir qilmaydi . Java x (3) qiymatini ko'chiradi va uni y ga joylashtiradi . Bu parametr qiymat bo'yicha o'tadi. Bir o'zgaruvchini boshqasiga yozmaysiz. Qiymat ko'chiriladi va yangi o'zgaruvchiga tayinlanadi. y = x ifodasi ; " X ni y ga yozish" degani EMAS . Bu " x ichidagi qiymatdan nusxa ko'chiring va bu nusxani y ga yozing " degan ma'noni anglatadi. Agar keyinroq y ni o'zgartirsam :
у = 34;
Bu x ga ta'sir qiladimi ? Albatta yo'q. x hali ham 3 qiymatiga ega. Agar x ni keyinroq o'zgartirsam :
х = 90;
Bu sizga qanday ta'sir qiladi ? Bo'lishi mumkin emas. Topshiriq bajarilgandan so'ng ular hech qanday aloqasi yo'q (qiymatni NOSHIRISH). Malumot turlari haqida nima deyish mumkin? Ular qanday ishlaydi? Unchalik qiyin emas, aslida qoida bir xil. Havolalar ham xuddi shunday qiladi - siz havolaning nusxasini olasiz. Shunday qilib, agar aytsam:
Cat A = new Cat ();
Cat B = A;
A havolasi B havolasiga ko'chiriladi. Bu ob'ektga taalluqli emas - sizda faqat bitta ob'ekt bor. Ammo endi sizda bir xil Cat ob'ektini boshqaradigan ikki xil havola mavjud . Endi usullarga parametrlarni o'tkazishni ko'rib chiqamiz. Java parametrlarni qiymat bo'yicha o'tkazadi. Har doim. Bu "qiymatni nusxalash va nusxani uzatish" degan ma'noni anglatadi. Ibtidoiy turlar uchun bu oson:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
doStuff usuli quyidagicha ko'rinadi:
void doStuff (int у) {

   / / Действия с 'y'
}
x qiymatining nusxasi , ya'ni 5 doStuff() usuliga uzatiladi . doStuff() usuli y deb nomlangan o'z o'zgaruvchisiga ega . y o'zgaruvchisi yangi, boshqa o'zgaruvchidir. Usulga o'tish vaqtida x da bo'lgan narsaning nusxasi bilan . Bundan buyon y va x bir-biriga ta'sir qilmaydi. y ni o'zgartirganingizda , siz x ga ta'sir qilmaysiz .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
Va aksincha - agar siz x ni o'zgartirsangiz, y ni o'zgartirmaysiz . Bu holatda x qilgan yagona narsa uning qiymatini nusxalash va uni doStuff() usuliga o'tkazish edi . "Qiymat bo'yicha o'tish" havolalar bilan qanday ishlaydi? Juda ko'p odamlar: "Java ibtidoiy turlarni qiymat bo'yicha va ob'ektlarni mos yozuvlar bo'yicha uzatadi" deyishadi. Bu ular aytganidek emas. Java hamma narsani qiymat bo'yicha o'tkazadi. Primitivlar bilan siz tarkibning nusxasini olasiz. Havolalar yordamida siz kontentning nusxasini ham olasiz. Lekin havolaning mazmuni nima? Masofaviy boshqarish. Ob'ektni boshqarish/kirish uchun imkoniyatlar. Ob'ektga havolani metodga o'tkazganingizda, siz havolaning nusxasini o'tkazasiz. Masofadan boshqarish klon. Ob'ekt hali ham o'zi yaratilgan qoziqda o'tirib, kimdir pultdan foydalanishini kutmoqda. Muassasa uni boshqarish uchun qancha masofadan boshqarish pulti “dasturlashtirilgan”iga ahamiyat bermaydi. Bu haqda faqat axlat yig'uvchi va siz dasturchi g'amxo'rlik qiladi. Shunday qilib, siz aytganingizda:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Faqat bitta Cat ob'ekti mavjud . Ammo endi ikkita masofadan boshqarish pulti (havola) bir xil Cat obyektiga kirishi mumkin . Shunday qilib, endi B Cat ob'ektiga nima qilsa, A ko'rsatgan Catga ta'sir qiladi , lekin bu A ning mazmuniga ta'sir qilmaydi ! Siz mushukni yangi B havolasidan foydalanib o'zgartirishingiz mumkin (to'g'ridan-to'g'ri A dan ko'chirilgan), lekin siz A ni o'zgartira olmaysiz. Bu nima degani? Siz A murojaat qiladigan ob'ektni o'zgartirishingiz mumkin , lekin siz A havolasini o'zgartira olmaysiz - uni boshqa ob'ektga yo'naltiring yoki null . Shunday qilib, agar siz B havolasini o'zgartirsangiz ( B havola qiladigan haqiqiy Cat ob'ekti emas , balki havolaning o'zi qiymati) siz A qiymatini o'zgartirmaysiz . Va teskari. Shunday qilib:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Bu shunchaki B boshqa ob'ektga ishora qilishini anglatadi . A hali ham xursand. Shunday qilib, mendan keyin takrorlang: Java hamma narsani qiymat bo'yicha o'tkazadi. (Yaxshi, yana bir marta... tuyg'u bilan.) Java hamma narsani qiymat bo'yicha o'tkazadi. Primitiv turlar uchun siz joriy qiymatning nusxasini, ob'ekt havolalari uchun havolaning nusxasini (masofadan boshqarish pulti) o'tkazasiz. Siz hech qachon ob'ektdan o'tmaysiz. Barcha ob'ektlar uyada saqlanadi. Har doim. Endi bir piyola kofe pishiring va kod yozing! Asl maqola.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION