JavaRush /Java blogi /Random-UZ /Usullar, ularning parametrlari, o'zaro ta'siri va ortiqch...

Usullar, ularning parametrlari, o'zaro ta'siri va ortiqcha yuklanishi

Guruhda nashr etilgan
Yana bir bor salom! Oxirgi ma'ruzada biz sinflar va konstruktorlar bilan tanishdik va o'zimizni yaratishni o'rgandik. Usullar, ularning parametrlari, o'zaro ta'siri va ortiqcha yuklanishi - 1Bugun biz usullar kabi darslarning ajralmas qismini batafsil ko'rib chiqamiz. Usul - bu dasturda qandaydir amallarni bajarishga imkon beruvchi buyruqlar to'plami. Boshqacha qilib aytganda, usul - bu funksiya; sizning sinfingiz qila oladigan narsa. Boshqa dasturlash tillarida usullar ko'pincha "funksiyalar" deb ataladi, lekin Java tilida "metod" so'zi ko'proq mashhur bo'lib ketdi :) Oxirgi ma'ruzada, esingizda bo'lsa, mushuklarimiz miyovlashi uchun Cat sinfi uchun oddiy usullarni yaratgan edik. va sakrab:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();
    }
}
sayMeow()va jump()bizning sinfimiz usullari. Ularning ishining natijasi konsolga chiqishdir:
Мяу!
Прыг-скок!
Bizning usullarimiz juda oddiy: ular matnni konsolga chop etishadi. Ammo Java-da usullarning asosiy vazifasi bor - ular ob'ekt ma'lumotlari ustida amallarni bajarishlari kerak . Ob'ekt ma'lumotlarining qiymatini o'zgartiring, uni o'zgartiring, konsolga chiqaring yoki u bilan boshqa biror narsa qiling. Bizning joriy usullarimiz ob'ekt ma'lumotlari bilan hech narsa qilmaydi Cat. Keling, aniqroq misolni ko'rib chiqaylik:
public class Truck {

    int length;
    int width;
    int height;
    int weight;

    public int getVolume() {
        int volume = length * width * height;
        return volume;
    }
}
Misol uchun, bizda yuk mashinasini ifodalovchi sinf bor - Truck. Yuk mashinasi tirkamasi uzunligi, kengligi va balandligi va vazniga ega (bu keyinroq kerak bo'ladi). Usulda getVolume()biz hisob-kitoblarni amalga oshiramiz - ob'ektimizning ma'lumotlarini hajmni ko'rsatadigan raqamga aylantiramiz (biz uzunlik, kenglik va balandlikni ko'paytiramiz). Bu usulning natijasi bo'ladigan raqam. E'tibor bering - bu usulning tavsifida yozilgan public int getVolume. Bu shuni anglatadiki, bu usulning natijasi shakldagi raqam bo'lishi kerakint . Biz usulning natijasini hisoblab chiqdik va endi uni usul deb atagan dasturimizga qaytarishimiz kerak. Java-da usulning natijasini qaytarish uchun kalit so'z ishlatiladi return.
return volume;

Usul parametrlari

Usullar "usul parametrlari" deb ataladigan qiymatlarni kiritish sifatida qabul qilishi mumkin. getVolume()Sinfdagi hozirgi usulimiz Truckhech qanday parametrlarni qabul qilmaydi, shuning uchun misolni yuk mashinalari bilan kengaytirishga harakat qilaylik. Keling, yangi sinf yarataylik - BridgeOfficer. Politsiya xodimi ko'prikda navbatchilik qiladi va barcha o'tayotgan yuk mashinalarini tekshiradi, ularning yuklari ruxsat etilgan og'irlik chegarasidan oshmaydi.
public class BridgeOfficer {

    int maxWeight;

    public BridgeOfficer(int normalWeight) {
        this.maxWeight = normalWeight;
    }

    public boolean checkTruck(Truck truck) {
        if (truck.weight > maxWeight) {
            return false;
        } else {
            return true;
        }
    }
}
Usul checkTruckkirish sifatida bitta parametrni oladi - yuk mashinasi ob'ekti Truckva ofitser yuk mashinasini ko'prikka ruxsat beradimi yoki yo'qligini aniqlaydi. Usul ichidagi mantiq juda oddiy: agar yuk mashinasining og'irligi ruxsat etilgan maksimal qiymatdan oshsa, usul qaytadi false. Siz boshqa yo'l izlashingiz kerak bo'ladi :( Agar vazn maksimaldan kam yoki teng bo'lsa, siz o'tishingiz mumkin va usul qaytadi true. Agar siz hali ham "qaytish", "usul qiymatni qaytaradi" iboralarini to'liq tushunmagan bo'lsangiz. ” - keling, dasturlashdan tanaffus olib, buni real hayotdan oddiy misol yordamida ko'rib chiqamiz :) Aytaylik, siz kasal bo'lib qoldingiz va bir necha kun ishlamadingiz. Siz buxgalteriya bo'limiga kasallik ta'tilingiz bilan kelasiz, uni to'lashingiz kerak. Agar biz usullar bilan o'xshashlik qilsak, buxgalterning usuli bor paySickLeave()("kasallik ta'tilini to'lash"). Siz ushbu usulga kasallik ta'tilining guvohnomasini parametr sifatida o'tkazasiz (unsiz usul ishlamaydi va sizga hech narsa to'lanmaydi!). Ish varag'i usuli ichida kerakli hisob-kitoblar amalga oshiriladi (buxgalter undan kompaniya sizga qancha to'lashi kerakligini hisoblash uchun foydalanadi) va ish natijasi sizga qaytariladi - pul summasi. Dastur xuddi shu tarzda ishlaydi. U usulni chaqiradi, u yerga ma'lumotlarni uzatadi va nihoyat natijani oladi. main()Mana bizning dasturimiz uchun usul BridgeOfficer:
public static void main(String[] args) {
    Truck first = new Truck();
    first.weight = 10000;
    Truck second = new Truck();
    second.weight = 20000;

    BridgeOfficer officer = new BridgeOfficer(15000);
    System.out.println("Truck number 1! May I pass, officer?");
    boolean canFirstTruckGo = officer.checkTruck(first);
    System.out.println(canFirstTruckGo);

    System.out.println();

    System.out.println("Truck number 2! May I?");
    boolean canSecondTruckGo = officer.checkTruck(second);
    System.out.println(canSecondTruckGo);
}
Biz 10 000 va 20 000 yuk bilan ikkita yuk mashinasini yaratmoqdamiz. Shu bilan birga, ofitser navbatchi bo'lgan ko'prik uchun maksimal og'irlik 15 000. Dastur deb nomlangan usul officer.checkTruck(first), usul hamma narsani hisoblab chiqdi va natijani dasturga qaytardi - true, va dastur uni o'zgaruvchida saqladi boolean canFirstTruckGo. Endi u u bilan xohlagan ishini qila oladi (xuddi siz hisobchidan olgan pulingiz kabi). Oxir-oqibat kod
boolean canFirstTruckGo = officer.checkTruck(first);
ga tushadi
boolean canFirstTruckGo = true;
Juda muhim nuqta: operator returnnafaqat usulning natijasini qaytaradi, balki uning ishini ham tugatadi ! Qaytgandan keyin yozilgan barcha kodlar bajarilmaydi!
public boolean checkTruck(Truck truck) {

    if (truck.weight > maxWeight) {
        return false;
        System.out.println("Turn around, overweight!");
    } else {
        return true;
        System.out.println("Alright, move on!");
    }
}
Ofitser aytgan iboralar konsolga chiqarilmaydi, chunki usul allaqachon natijani qaytargan va o'z ishini yakunlagan! Dastur usul chaqirilgan nuqtaga qaytdi. Bu haqda o'zingiz tashvishlanishingiz shart emas - Java kompilyatori dan keyin kod yozishga harakat qilsangiz, xatoga yo'l qo'yadigan darajada aqlli return.

Qasoskorlar: Variantlar urushi

Bizning dasturimiz usul qanday ishlashi uchun bir nechta variantni talab qiladigan holatlar mavjud. Nega biz o'z sun'iy intellektimizni yaratmaymiz? Amazonda Alexa bor, Yandeksda Elis bor, nega biz yomonroqmiz? :) Temir odam haqidagi filmda Toni Stark o'zining ajoyib sun'iy intellektini yaratdi - JARVIS Ajoyib qahramonga hurmat bajo keltiramiz va uning sharafiga AIni nomlaymiz :) The Biz Jarvisga o'rgatishimiz kerak bo'lgan birinchi narsa - xonaga kirgan odamlarga salom berish (agar bunday buyuk intellekt odobsiz bo'lib chiqsa, g'alati bo'lar edi).
public class Jarvis {

    public void sayHi(String name) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
    }
}
Konsol chiqishi:
Добрый вечер, Тони Старк, How ваши дела?
Ajoyib! Jarvis kirgan odamni qanday kutib olishni biladi. Ko'pincha, albatta, bu uning egasi - Toni Stark bo'ladi. Ammo u yolg'iz kelmasligi mumkin! Va bizning usulimiz sayHi()kirish sifatida faqat bitta argumentni oladi. Va shunga ko'ra, u kelganlardan faqat biriga salom bera oladi, ikkinchisini esa mensimaydi. Juda muloyim emas, rozimisiz? :/ Bunday holda, masalani hal qilish uchun biz sinfga bir xil nomdagi, ammo parametrlari har xil bo'lgan 2 ta usulni yozishimiz mumkin:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ", How are you doing?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
    }
}
Bu usulni haddan tashqari yuklash deb ataladi . Haddan tashqari yuklash bizning dasturimizni yanada moslashuvchan bo'lishiga va turli xil ish variantlariga moslashishiga imkon beradi. Keling, qanday ishlashini tekshirib ko'ramiz:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ", How are you doing?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
        jarvis.sayHi("Tony Stark", "Captain America");
    }
}
Konsol chiqishi:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
Ajoyib, ikkala variant ham ishladi :) Biroq, biz muammoni hal qilmadik! Agar uchta mehmon bo'lsa-chi? Albatta, biz sayHi()uchta mehmonning ismlarini qabul qilish uchun usulni yana ortiqcha yuklashimiz mumkin. Ammo ulardan 4 yoki 5 tasi bo'lishi mumkin va hokazo. Jarvisni har qanday nomlar bilan ishlashga o'rgatishning yana bir usuli bormi, millionlab usullarni ortiqcha yuklamasdan sayHi()? :/ Albatta bor! Aks holda, Java dunyodagi eng mashhur dasturlash tili bo'larmidi? ;)
public void sayHi(String...names) {

    for (String name: names) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }
}
Parametr sifatida o'tkazilgan yozuv ( String...names) metodga ma'lum miqdordagi qatorlar uzatilganligini ko'rsatishga imkon beradi. Biz qancha bo'lishi kerakligini oldindan belgilamaymiz, shuning uchun usulimizning ishlashi endi ancha moslashuvchan bo'ladi:
public class Jarvis {

    public void sayHi(String...names) {
        for (String name: names) {
            System.out.println("Good evening, " + name + ", How are you doing?");
        }
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
    }
}
Konsol chiqishi:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Капитан Америка, How ваши дела?
Добрый вечер, Черная Вдова, How ваши дела?
Добрый вечер, Халк, How ваши дела?
Bu erdagi kodlarning ba'zilari sizga notanish, ammo bunga qarshi bo'lmang. Uning mohiyati oddiy - usul o'z navbatida barcha nomlardan o'tadi va mehmonlarning har biri bilan salomlashadi! Bundan tashqari, u istalgan miqdordagi uzatilgan liniyalar uchun ishlaydi! Ikki, o'n, hatto ming - usul har qanday mehmonlar soni bilan ishonchli ishlaydi. Barcha mumkin bo'lgan variantlar uchun ortiqcha yuklarni bajarishdan ko'ra ancha qulayroq, rozi emasmisiz? :) Yana bir muhim nuqta: argumentlar tartibi muhim! Aytaylik, bizning usulimiz kirish sifatida satr va raqamni oladi:
public class Man {

    public static void sayYourAge(String greeting, int age) {
        System.out.println(greeting + " " + age);
    }

    public static void main(String[] args) {
        sayYourAge("My age - ", 33);
        sayYourAge(33, "My age - "); //error!
    }
}
Agar sayYourAgesinf usuli Mankirish sifatida satr va raqamni qabul qilsa, u holda ular dasturda o'tkazilishi kerak bo'lgan tartibdir! Agar biz ularni boshqacha tartibda o'tkazsak, kompilyator xato qiladi va odam o'z yoshini ayta olmaydi. Aytgancha, oxirgi ma'ruzada biz yoritgan konstruktorlar ham usullardir! Ular, shuningdek, haddan tashqari yuklanishi mumkin (turli argumentlar to'plamiga ega bir nechta konstruktorlarni yaratish) va ular uchun argumentlarni o'tkazish tartibi ham muhim ahamiyatga ega. Haqiqiy usullar! :)

Va yana parametrlar haqida

Ha, ha, biz ular bilan hali tugamaganmiz :) Hozir ko'rib chiqadigan mavzu juda muhim. Kelajakdagi barcha intervyularingizda bu haqda so'rashlari 90% ehtimoli bor! Parametrlarni usullarga o'tkazish haqida gaplashamiz. Keling, oddiy misolni ko'rib chiqaylik:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        currentYear = currentYear-10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year now?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("And now?");
        System.out.println(currentYear);
    }
}
Vaqt mashinasining ikkita usuli bor. Ikkalasi ham joriy yilni ifodalovchi raqamni kiritadi va qiymatni oshiradi yoki kamaytiradi (vaqtga yoki kelajakka qaytishni xohlashimizga qarab). Lekin, konsol chiqishidan ko'rinib turibdiki, usul ishlamadi! Konsol chiqishi:
Какой сейчас год?
2020
А сейчас?
2020
Biz o'zgaruvchini currentYearusuliga o'tkazdik goToPast(), lekin uning qiymati o'zgarmadi. 2020-yilda bo'lganidek, shunday bo'lib qoldi. Lekin nima uchun? :/ Chunki Java-da primitivlar qiymat bo'yicha usullarga o'tkaziladi. Bu nima degani? Biz metodni chaqirib goToPast(), u yerga o'zgaruvchimizni uzatganimizda int currentYear = 2020, o'zgaruvchining o'zi emas currentYear, balki uning nusxasi usulga kiradi . Ushbu nusxaning qiymati, albatta, 2020 yilga teng, ammo nusxada sodir bo'lgan barcha o'zgarishlar bizning asl o'zgaruvchimizga hech qanday ta'sir qilmaydicurrentYear ! Keling, kodimizni batafsilroq qilaylik va nima sodir bo'lishini ko'rib chiqaylik currentYear:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        System.out.println("The goToPast method has started!");
        System.out.println("The currentYear value inside the goToPast method (at the beginning) = " + currentYear);
        currentYear = currentYear-10;
        System.out.println("The currentYear value inside the goToPast method (at the end) = " + currentYear);
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year at the very beginning of the program?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("What year is it now?");
        System.out.println(currentYear);
    }
}
Konsol chiqishi:
Какой год в самом начале работы программы?
2020
Метод goToPast начал работу!
Значение currentYear внутри метода goToPast (в начале) = 2020
Значение currentYear внутри метода goToPast (в конце) = 2010
А сейчас Howой год?
2020
Bu usulga o'tkazilgan o'zgaruvchining goToPast()faqat nusxa ekanligini aniq ko'rsatadi currentYear. Va nusxani o'zgartirish "asl" ning ma'nosiga hech qanday ta'sir ko'rsatmadi. " Malumot orqali o'tish " mutlaqo teskari ma'noga ega. Keling, mushuklar ustida mashq qilaylik! Aytmoqchimanki, keling, havola orqali o'tish mushuklarni misol sifatida ishlatish qanday ekanligini ko'rib chiqaylik :)
public class Cat {

    int age;

    public Cat(int age) {
        this.age = age;
    }
}
Endi biz vaqt mashinamiz yordamida o'tmish va kelajakka sayohat qiluvchi dunyodagi birinchi mushuk bo'lgan Barsikni ishga tushiramiz! TimeMachineMashina ob'ektlar bilan ishlashi uchun sinfni o'zgartiramiz Cat;
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat.age -= 10;
    }
}
Endi usullar nafaqat o'tgan raqamni, balki agema'lum bir ob'ektning maydonini ham o'zgartiradi Cat. Esingizda bo'lsa, ibtidoiylar bo'lsa, biz muvaffaqiyatga erisha olmadik: asl raqam o'zgarmadi. Keling, bu erda nima sodir bo'lishini ko'rib chiqaylik!
public static void main(String[] args) {

    TimeMachine timeMachine = new TimeMachine();
    Cat barsik = new Cat(5);

    System.out.println("How old is Barsik at the very beginning of the program?");
    System.out.println(barsik.age);

    timeMachine.goToFuture(barsik);
    System.out.println("And now?");
    System.out.println(barsik.age);

    System.out.println("Firs-sticks! Barsik has aged 10 years! Drive back quickly!");
    timeMachine.goToPast(barsik);
    System.out.println("Did it work? Have we returned the cat to its original age?");
    System.out.println(barsik.age);
}
Konsol chiqishi:
Сколько лет Барсику в самом начале работы программы?
5
А теперь?
15
Елки-палки! Барсик постарел на 10 лет! Живо гони назад!
Получилось? Мы вернули коту его изначальный возраст?
5
Voy-buy! Endi usul boshqacha ishladi: bizning mushukimiz birdan qarib qoldi, keyin yana yoshroq ko'rindi! :) Keling, nima uchun ekanligini tushunishga harakat qilaylik. Primitivlar bilan misoldan farqli o'laroq, ob'ektlar holatida ob'ektga havola usulga o'tkaziladi. Asl ob'ektimizga havola usullarga goToFuture(barsik)o'tkazildi . Shuning uchun, biz ichki usullarni o'zgartirganimizda , biz ob'ektimiz saqlanadigan xotira maydoniga kiramiz. Bu biz boshida yaratgan o'sha Barsikka havola. Bu "ma'lumotnoma bo'yicha o'tish" deb ataladi! Biroq, bu havolalar bilan hamma narsa oddiy emas :) Keling, misolimizni o'zgartirishga harakat qilaylik: goToPast(barsik)barsikbarsik.age
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat = new Cat(cat.age);
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat = new Cat(cat.age);
        cat.age -= 10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        Cat barsik = new Cat(5);

        System.out.println("How old is Barsik at the very beginning of the program?");
        System.out.println(barsik.age);

        timeMachine.goToFuture(barsik);
        System.out.println("Barsik went to the future! Has his age changed?");
        System.out.println(barsik.age);

        System.out.println("And if you try in the past?");
        timeMachine.goToPast(barsik);
        System.out.println(barsik.age);
    }
}
Konsol chiqishi:
Сколько лет Барсику в самом начале работы программы?
5
Барсик отправился в будущее! Его возраст изменился?
5
А если попробовать в прошлое?
5
Yana ishlamayapti! O_O Keling, nima bo'lganini aniqlaylik :) Bularning barchasi havolalar qanday ishlashi usullari goToPast/ goToFutureva mexanikasi haqida. Endi diqqat!Bu nuqta havolalar va usullar qanday ishlashini tushunishda eng muhim hisoblanadi. Aslida, biz metodni chaqirganimizda, unga ob'ekt havolasining o'zi emas , balki ushbu havolaning nusxasi goToFuture(Cat cat)uzatiladi . cat Ya'ni, ob'ektni metodga o'tkazganimizda, ushbu ob'ektga ikkita havola mavjud . Bu nima sodir bo'layotganini tushunish uchun juda muhimdir. Axir, shuning uchun bizning oxirgi misolimiz mushukning yoshini o'zgartirmadi. Oldingi misolda yoshni o'zgartirish bilan biz oddiygina usul ichida o'tkazilgan ma'lumotnomani oldik goToFuture(), uning yordamida ob'ektni xotirada topdik va uning yoshini o'zgartirdik ( cat.age += 10). Endi usul ichida goToFuture()biz yangi ob'ekt yaratamiz
(cat = new Cat(cat.age)),
va usulga uzatilgan bir xil nusxa havolasi ushbu ob'ektga tayinlangan. Natijada:
  • Birinchi havola ( Cat barsik = new Cat(5)) asl mushukga ishora qiladi (5 yoshda)
  • O'zgaruvchini catmetodga o'tkazganimizdan goToPast(Cat cat)va uni yangi ob'ektga tayinlaganimizdan so'ng, havola nusxa olindi.
Shundan so'ng, biz yakuniy vaziyatga egamiz: ikkita havola ikki xil ob'ektga ishora qiladi. Ammo biz ulardan faqat bittasining yoshini o'zgartirdik - biz uslub ichida yaratganimiz.
cat.age += 10;
main()Va tabiiyki, biz uni usulda konsolga chiqarganimizda barsik.age, uning yoshi o'zgarmaganligini ko'ramiz. Axir barsik, bu mos yozuvlar o'zgaruvchisi bo'lib, u hali ham hech narsa sodir bo'lmagan 5 yoshga to'lgan eski, asl ob'ektga ishora qiladi. Yoshi bilan barcha manipulyatsiyalarimiz yangi ob'ektda amalga oshirildi. Shunday qilib, ob'ektlar mos yozuvlar orqali usullarga o'tkaziladi. Ob'ektlarning nusxalari hech qachon avtomatik ravishda yaratilmaydi. Agar siz mushuk ob'ektini usulga o'tkazsangiz va uning yoshini o'zgartirsangiz, u muvaffaqiyatli o'zgaradi. Ammo mos yozuvlar o'zgaruvchilari qiymatlari usullarni tayinlash va/yoki chaqirishda ko'chiriladi! Bu yerda primitivlarni o‘tkazish haqidagi paragrafni takrorlaymiz: “Usulni chaqirib changeInt(), o‘z o‘zgaruvchimizni u yerga o‘tkazsak int x = 15, o‘zgaruvchining o‘zi emas x, balki uning nusxasi metodga kiradi.Axir , nusxada sodir bo‘ladigan barcha o‘zgarishlar shunday bo‘lmaydi. bizning asl o'zgaruvchimizga har qanday tarzda ta'sir qiladi x. Havolani nusxalash bilan hamma narsa xuddi shunday ishlaydi! Siz mushuk ob'ektini usulga o'tkazasiz. Agar siz mushukning o'zi bilan biror narsa qilsangiz (ya'ni xotiradagi ob'ekt bilan), barcha o'zgarishlar muvaffaqiyatli o'tadi - bizda faqat bitta ob'ekt bor edi va u hali ham mavjud. Ammo metod ichida siz yangi ob'ekt yaratib, uni usulning parametri bo'lgan mos yozuvlar o'zgaruvchisida saqlasangiz, bundan buyon bizda ikkita ob'ekt va ikkita mos yozuvlar o'zgaruvchilari mavjud. Ana xolos! Bu unchalik oson emas edi, siz hatto bir necha marta ma'ruza qilishingiz kerak bo'lishi mumkin. Ammo asosiysi, siz ushbu juda muhim mavzuni o'rgandingiz. Java-da argumentlar qanday uzatilishi haqida tez-tez argumentlarga (hatto tajribali ishlab chiquvchilar orasida ham) duch kelasiz. Endi siz uning qanday ishlashini aniq bilasiz. Shunday davom eting! :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION