JavaRush /Java blogi /Random-UZ /Polimorfizm va uning do'stlari
Viacheslav
Daraja

Polimorfizm va uning do'stlari

Guruhda nashr etilgan
Polimorfizm ob'ektga yo'naltirilgan dasturlashning asosiy tamoyillaridan biridir. Bu sizga Java-ning kuchli matn terish kuchidan foydalanish va foydalanish mumkin bo'lgan va qo'llab-quvvatlanadigan kod yozish imkonini beradi. U haqida ko'p narsa aytilgan, ammo umid qilamanki, har bir kishi ushbu sharhdan yangi narsalarni olib qo'yishi mumkin.
Polimorfizm va uning do'stlari - 1

Kirish

O'ylaymanki, Java dasturlash tili Oracle kompaniyasiga tegishli ekanligini hammamiz bilamiz. Shuning uchun bizning yo'limiz saytdan boshlanadi: www.oracle.com . Asosiy sahifada "Menyu" mavjud. Unda "Hujjatlar" bo'limida "Java" bo'limi mavjud. Tilning asosiy funktsiyalari bilan bog'liq bo'lgan barcha narsalar "Java SE hujjatlari" ga tegishli, shuning uchun biz ushbu bo'limni tanlaymiz. Hujjatlar bo'limi so'nggi versiya uchun ochiladi, ammo hozircha "Boshqa versiyani qidiryapsizmi?" Variantni tanlaymiz: JDK8. Sahifada biz juda ko'p turli xil variantlarni ko'ramiz. Ammo biz Tilni o'rganishga qiziqamiz: " Java Tutorials Learning Paths ". Ushbu sahifada biz boshqa bo'limni topamiz: " Java tilini o'rganish ". Bu Oracle'dan Java asoslari bo'yicha o'quv qo'llanmasi eng muqaddasdir. Java - bu ob'ektga yo'naltirilgan dasturlash tili (OOP), shuning uchun tilni hatto Oracle veb-saytida o'rganish " Obyektga yo'naltirilgan dasturlash tushunchalari " ning asosiy tushunchalarini muhokama qilishdan boshlanadi. Nomining o'zidan ko'rinib turibdiki, Java ob'ektlar bilan ishlashga qaratilgan. " Ob'ekt nima? " bo'limidan ko'rinib turibdiki, Java tilidagi ob'ektlar holat va xatti-harakatlardan iborat. Tasavvur qiling, bizda bank hisobi bor. Hisobdagi pul miqdori davlatdir va bu davlat bilan ishlash usullari xulq-atvordir. Ob'ektlar qandaydir tarzda tasvirlanishi kerak (ular qanday holat va xatti-harakatlarga ega bo'lishi mumkinligini ayting) va bu tavsif sinfdir . Biz ba'zi bir sinf ob'ektini yaratganimizda, biz ushbu sinfni belgilaymiz va bu " ob'ekt turi " deb ataladi. Demak, Java tilining " 4-bo'lim. Turlar, qiymatlar va o'zgaruvchilar " bo'limidagi Java tili spetsifikatsiyasida ko'rsatilganidek, qattiq terilgan til ekanligi aytiladi . Java tili OOP tushunchalariga amal qiladi va kengaytirilgan kalit so'z yordamida merosni qo'llab-quvvatlaydi. Nima uchun kengaytirish? Chunki meros bilan bolalar sinfi ota-ona sinfining xatti-harakati va holatini meros qilib oladi va ularni to'ldirishi mumkin, ya'ni. asosiy sinfning funksionalligini kengaytirish. Interfeys sinf tavsifida amaliy kalit so'z yordamida ham ko'rsatilishi mumkin. Sinf interfeysni amalga oshirganda, bu sinf qandaydir shartnomaga mos kelishini anglatadi - dasturchi tomonidan boshqa muhitga sinfning ma'lum bir xatti-harakati borligi to'g'risidagi deklaratsiya. Masalan, pleerda turli tugmalar mavjud. Ushbu tugmalar pleerning xatti-harakatlarini boshqarish uchun interfeys bo'lib, xatti-harakatlar pleerning ichki holatini o'zgartiradi (masalan, ovoz balandligi). Bunday holda, holat va xatti-harakatlar tavsif sifatida sinfni beradi. Agar sinf interfeysni amalga oshirsa, u holda ushbu klass yordamida yaratilgan ob'ekt nafaqat sinfga, balki interfeysga qarab ham turga qarab tavsiflanishi mumkin. Keling, bir misolni ko'rib chiqaylik:
public class MusicPlayer {

    public static interface Device {
        public void turnOn();
        public void turnOff();
    }

    public static class Mp3Player implements Device {
        public void turnOn() {
            System.out.println("On. Ready for mp3.");
        }
        public void turnOff() {
            System.out.println("Off");
        }
    }

    public static class Mp4Player extends Mp3Player {
        @Override
        public void turnOn() {
            System.out.println("On. Ready for mp3/mp4.");
        }
    }

    public static void main(String []args) throws Exception{
        // Какое-то устройство (Тип = Device)
        Device mp3Player = new Mp3Player();
        mp3Player.turnOn();
        // У нас есть mp4 проигрыватель, но нам от него нужно только mp3
        // Пользуемся им How mp3 проигрывателем (Тип = Mp3Player)
        Mp3Player mp4Player = new Mp4Player();
        mp4Player.turnOn();
    }
}
Tur - bu juda muhim tavsif. Bu ob'ekt bilan qanday ishlashimizni aytadi, ya'ni. ob'ektdan qanday xatti-harakatni kutamiz. Xulq-atvor - bu usullar. Shuning uchun, keling, usullarni tushunaylik. Oracle veb-saytida usullar Oracle Qo'llanmasida o'z bo'limiga ega: " Usullarni aniqlash ". Maqoladan olib tashlash kerak bo'lgan birinchi narsa: Usulning imzosi - bu usulning nomi va parametr turlari :
Polimorfizm va uning do'stlari - 2
Misol uchun, metodni public void usulini e'lon qilishda (Object o), imzo usulning nomi va Object parametrining turi bo'ladi. Qaytish turi imzoga kiritilmagan. Bu muhim! Keyinchalik, manba kodimizni kompilyatsiya qilaylik. Ma'lumki, buning uchun kod sinf nomi va java kengaytmali faylda saqlanishi kerak. Java kodi " javac " kompilyatori yordamida Java virtual mashinasi (JVM) tomonidan bajarilishi mumkin bo'lgan oraliq formatga kompilyatsiya qilinadi . Ushbu oraliq format bayt kod deb ataladi va .class kengaytmali fayllarda mavjud. Keling, kompilyatsiya qilish buyrug'ini bajaramiz: javac MusicPlayer.java java kodi kompilyatsiya qilingandan so'ng, biz uni bajarishimiz mumkin. Ishga tushirish uchun " java " yordam dasturidan foydalanib, java virtual mashinasi jarayoni sinf faylida uzatilgan bayt kodini bajarish uchun ishga tushiriladi. Ilovani ishga tushirish uchun buyruqni bajaramiz: java MusicPlayer. Println usulining kiritish parametrida ko'rsatilgan matnni ekranda ko'ramiz. Qizig'i shundaki, bayt-kod .class kengaytmali faylda bo'lsa, biz uni " javap " yordam dasturi yordamida ko'rishimiz mumkin. <ocde>javap -c MusicPlayer buyrug'ini ishga tushiramiz:
Polimorfizm va uning do'stlari - 3
Bayt-koddan ko'rishimiz mumkinki, turi sinfi ko'rsatilgan ob'ekt orqali usulni chaqirish - yordamida amalga oshiriladi invokevirtualva kompilyator qaysi usul imzosini qo'llash kerakligini hisoblab chiqdi. Nima uchun invokevirtual? Chunki virtual usulning chaqiruvi (invoke chaqiruv deb tarjima qilinadi) mavjud. Virtual usul nima? Bu dasturni bajarish jarayonida tanasini bekor qilish mumkin bo'lgan usul. Tasavvur qiling-a, sizda ma'lum bir kalit (usul imzosi) va usulning tanasi (kodi) o'rtasidagi yozishmalar ro'yxati bor. Va kalit va usul tanasi o'rtasidagi bu yozishmalar dasturni bajarish jarayonida o'zgarishi mumkin. Shuning uchun usul virtualdir. Odatiy bo'lib, Java'da statik EMAS, yakuniy EMAS va shaxsiy EMAS usullar virtual hisoblanadi. Buning yordamida Java polimorfizmning ob'ektga yo'naltirilgan dasturlash tamoyilini qo'llab-quvvatlaydi. Siz allaqachon tushunganingizdek, bugungi sharhimiz shu.

Polimorfizm

Oracle veb-saytida ularning rasmiy qo'llanmasida alohida bo'lim mavjud: " Polimorfizm ". Java-da polimorfizm qanday ishlashini ko'rish uchun Java Online kompilyatoridan foydalanamiz . Masalan, bizda Java-da raqamni ifodalovchi mavhum sinf raqami mavjud. Bu nimaga imkon beradi? U barcha merosxo'rlarga ega bo'ladigan ba'zi asosiy texnikaga ega. Raqamni meros qilib olgan har bir kishi tom ma'noda aytadi: "Men raqamman, siz men bilan raqam sifatida ishlashingiz mumkin". Masalan, har qanday vorisi uchun Integer qiymatini olish uchun intValue() usulidan foydalanishingiz mumkin. Agar siz Number uchun java api-ga qarasangiz, usul mavhum ekanligini ko'rishingiz mumkin, ya'ni raqamning har bir vorisi bu usulni o'zi amalga oshirishi kerak. Lekin bu bizga nima beradi? Keling, bir misolni ko'rib chiqaylik:
public class HelloWorld {

    public static int summ(Number first, Number second) {
        return first.intValue() + second.intValue();
    }

    public static void main(String []args){
        System.out.println(summ(1, 2));
        System.out.println(summ(1L, 4L));
        System.out.println(summ(1L, 5));
        System.out.println(summ(1.0, 3));
    }
}
Misoldan ko'rinib turibdiki, polimorfizm tufayli biz Raqamning avlodi bo'ladigan har qanday turdagi argumentlarni kiritish sifatida qabul qiladigan usulni yozishimiz mumkin (biz Numberni ololmaymiz, chunki u mavhum sinf). O'yinchi misolida bo'lgani kabi, bu holda biz raqam kabi biror narsa bilan ishlashni xohlayotganimizni aytmoqdamiz. Biz bilamizki, Raqam bo'lgan har bir kishi uning butun son qiymatini bera olishi kerak. Va bu biz uchun etarli. Biz ma'lum bir ob'ektni amalga oshirish tafsilotlariga kirmoqchi emasmiz va bu ob'ekt bilan raqamning barcha avlodlari uchun umumiy usullar orqali ishlashni xohlaymiz. Biz uchun mavjud bo'lgan usullar ro'yxati kompilyatsiya vaqtida turi bo'yicha aniqlanadi (avval bayt kodida ko'rganimizdek). Bu holda bizning turimiz Raqam bo'ladi. Misoldan ko'rinib turibdiki, biz har xil turdagi turli raqamlarni o'tkazmoqdamiz, ya'ni yig'indi usuli Integer, Long va Double ni kiritish sifatida qabul qiladi. Ammo ularning barchasida umumiy narsa shundaki, ular mavhum sonning avlodlaridir va shuning uchun intValue usulida ularning xatti-harakatlarini bekor qiladi, chunki har bir muayyan tur bu turni Integerga qanday chiqarishni biladi. Bunday polimorfizm inglizcha "Overriding" deb ataladigan "overriding" orqali amalga oshiriladi.
Polimorfizm va uning do'stlari - 4
Overriding yoki dinamik polimorfizm. Shunday qilib, keling, HelloWorld.java faylini quyidagi tarkib bilan saqlashdan boshlaylik:
public class HelloWorld {
    public static class Parent {
        public void method() {
            System.out.println("Parent");
        }
    }
    public static class Child extends Parent {
        public void method() {
            System.out.println("Child");
        }
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent child = new Child();
        parent.method();
        child.method();
    }
}
Keling, qilaylik javac HelloWorld.javava javap -c HelloWorld:
Polimorfizm va uning do'stlari - 5
Ko'rib turganingizdek, usul chaqiruvi bo'lgan satrlar uchun bayt kodida qo'ng'iroq qilish usuliga bir xil havola ko'rsatilgan invokevirtual (#6). Keling buni bajaramiz java HelloWorld. Ko'rib turganimizdek, ota-ona va bola o'zgaruvchilari Parent turi bilan e'lon qilinadi, lekin amalga oshirishning o'zi o'zgaruvchiga qaysi ob'ekt tayinlanganiga (ya'ni, qaysi turdagi ob'ektga) qarab chaqiriladi. Dasturni bajarish paytida (ular ish vaqtida ham aytadilar) JVM ob'ektga qarab, bir xil imzo yordamida usullarni chaqirganda, turli usullarni bajardi. Ya'ni, tegishli imzo kalitidan foydalanib, biz birinchi navbatda bitta usul tanasini oldik, keyin esa boshqasini oldik. O'zgaruvchida qanday ob'ekt mavjudligiga qarab. Dasturni bajarish vaqtida qaysi usul chaqirilishini aniqlash kechikish yoki dinamik bog'lash deb ham ataladi. Ya'ni, imzo va usul tanasi o'rtasidagi moslashuv, usul chaqirilgan ob'ektga qarab, dinamik ravishda amalga oshiriladi. Tabiiyki, siz sinfning statik a'zolarini (Sinf a'zosi), shuningdek kirish turi xususiy yoki yakuniy bo'lgan sinf a'zolarini bekor qila olmaysiz. @Override izohlari ham ishlab chiquvchilarga yordam beradi. Bu kompilyatorga ushbu nuqtada biz ajdodlar usulining xatti-harakatlarini bekor qilishimizni tushunishga yordam beradi. Agar biz usul imzosida xatoga yo'l qo'ygan bo'lsak, kompilyator darhol bu haqda bizga xabar beradi. Masalan:
public static class Parent {
        public void method() {
            System.out.println("parent");
        }
}
public static class Child extends Parent {
        @Override
        public void method(String text) {
            System.out.println("child");
        }
}
Xato bilan kompilyatsiya qilinmaydi: xato: usul supertipdagi usulni bekor qilmaydi yoki amalga oshirmaydi
Polimorfizm va uning do'stlari - 6
Qayta ta'rif " kovariatsiya " tushunchasi bilan ham bog'liq . Keling, bir misolni ko'rib chiqaylik:
public class HelloWorld {
    public static class Parent {
        public Number method() {
            return 1;
        }
    }
    public static class Child extends Parent {
        @Override
        public Integer method() {
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println(new Child().method());
    }
}
Ko'rinib turgan mavhumlikka qaramay, ma'no shundan iboratki, bekor qilishda biz nafaqat ajdodda ko'rsatilgan turni, balki aniqroq turni ham qaytarishimiz mumkin. Misol uchun, ajdod Raqamni qaytardi va biz Integer - raqamning avlodini qaytarishimiz mumkin. Xuddi shu narsa usulda e'lon qilingan istisnolar uchun ham amal qiladi. Merosxo'rlar usulni bekor qilishi va chiqarilgan istisnoni yaxshilashi mumkin. Ammo ular kengaytira olmaydi. Ya'ni, agar ota-ona IOExceptionni tashlasa, biz aniqroq EOFExceptionni tashlashimiz mumkin, lekin biz Istisnoni tashlay olmaymiz. Xuddi shunday, siz qamrovni toraytira olmaysiz va qo'shimcha cheklovlar qo'yolmaysiz. Masalan, siz statik qo'sha olmaysiz.
Polimorfizm va uning do'stlari - 7

Yashirish

" Yashirish " kabi bir narsa ham bor . Misol:
public class HelloWorld {
    public static class Parent {
        public static void method() {
            System.out.println("Parent");
        }
    }
    public static class Child extends Parent {
        public static void method() {
            System.out.println("Child");
        }
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent child = new Child();
        parent.method();
        child.method();
    }
}
Agar bu haqda o'ylab ko'rsangiz, bu juda aniq narsa. Sinfning statik a'zolari sinfga tegishli, ya'ni. o'zgaruvchining turiga. Shuning uchun, agar bola Ota-ona turi bo'lsa, u holda usul bolaga emas, balki Ota-onaga chaqirilishi mantiqan to'g'ri. Agar biz ilgari qilganimiz kabi bayt kodiga qarasak, statik usul invokestatic yordamida chaqirilishini ko'ramiz. Bu JVMga invokevirtual yoki invokeinterface kabi usullar jadvaliga emas, balki turga qarash kerakligini tushuntiradi.
Polimorfizm va uning do'stlari - 8

Haddan tashqari yuklash usullari

Java Oracle qo'llanmasida yana nimani ko'ramiz? Oldin o'rganilgan " Usullarni aniqlash " bo'limida ortiqcha yuklanish haqida biror narsa bor. Bu nima? Rus tilida bu "usulni haddan tashqari yuklash" va bunday usullar "ortiqcha yuk" deb ataladi. Shunday qilib, usulning haddan tashqari yuklanishi. Bir qarashda hamma narsa oddiy. Keling, onlayn Java kompilyatorini ochaylik, masalan tutorialspoint online java kompilyator .
public class HelloWorld {

	public static void main(String []args){
		HelloWorld hw = new HelloWorld();
		hw.say(1);
		hw.say("1");
	}

	public static void say(Integer number) {
		System.out.println("Integer " + number);
	}
	public static void say(String number) {
		System.out.println("String " + number);
	}
}
Shunday qilib, bu erda hamma narsa oddiy ko'rinadi. Oracle qo'llanmasida aytilganidek, haddan tashqari yuklangan usullar (bu holda aytish usuli) usulga uzatilgan argumentlar soni va turi bilan farqlanadi. Siz bir xil nom va bir xil miqdordagi bir xil turdagi argumentlarni e'lon qila olmaysiz, chunki kompilyator ularni bir-biridan ajrata olmaydi. Darhol juda muhim narsani ta'kidlash kerak:
Polimorfizm va uning do'stlari - 9
Ya'ni, ortiqcha yuklanganda, kompilyator to'g'riligini tekshiradi. Bu muhim. Ammo kompilyator ma'lum bir usulni chaqirish kerakligini qanday aniqlaydi? U Java tili spetsifikatsiyasida tasvirlangan "Eng maxsus usul" qoidasidan foydalanadi: " 15.12.2.5. Eng xos usulni tanlash ". Uning qanday ishlashini ko'rsatish uchun keling, Oracle Certified Professional Java Programmer-dan misol keltiraylik:
public class Overload{
  public void method(Object o) {
    System.out.println("Object");
  }
  public void method(java.io.FileNotFoundException f) {
    System.out.println("FileNotFoundException");
  }
  public void method(java.io.IOException i) {
    System.out.println("IOException");
  }
  public static void main(String args[]) {
    Overload test = new Overload();
    test.method(null);
  }
}
Bu yerdan misol keltiring: https://github.com/stokito/OCPJP/blob/master/src/ru/habrahabr/blogs/java/OCPJP1/question1/Overload.j... Ko'rib turganingizdek, biz o'tmoqdamiz. usul uchun null. Kompilyator eng aniq turni aniqlashga harakat qiladi. Ob'ekt mos emas, chunki hamma narsa undan meros. Davom etishga ruxsat. Istisnolarning 2 toifasi mavjud. Keling, java.io.IOException ni ko'rib chiqamiz va "To'g'ridan-to'g'ri ma'lum bo'lgan pastki sinflar" da FileNotFoundException mavjudligini ko'ramiz. Ya'ni, FileNotFoundException eng o'ziga xos turi ekanligi ma'lum bo'ldi. Shunday qilib, natijada "FileNotFoundException" qatorining chiqishi bo'ladi. Ammo agar biz IOException ni EOFException bilan almashtirsak, bizda tur daraxtida ierarxiyaning bir xil darajasida ikkita usul borligi ma'lum bo'ladi, ya'ni ikkalasi uchun IOException ota-ona hisoblanadi. Kompilyator qaysi usulni chaqirishni tanlay olmaydi va kompilyatsiya xatosini chiqaradi: reference to method is ambiguous. Yana bir misol:
public class Overload{
    public static void method(int... array) {
        System.out.println("1");
    }

    public static void main(String args[]) {
        method(1, 2);
    }
}
1 chiqadi. Bu yerda hech qanday savol yo'q. Int... turi - bu vararg https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html va aslida "sintaktik shakar"dan boshqa narsa emas va aslida int. .. massiv int[] massivi sifatida o'qilishi mumkin. Agar endi usul qo'shsak:
public static void method(long a, long b) {
	System.out.println("2");
}
Keyin 1 emas, balki 2 ko'rsatiladi, chunki biz 2 ta raqamni uzatmoqdamiz va 2 ta argument bitta massivga qaraganda yaxshiroq mos keladi. Agar biz usul qo'shsak:
public static void method(Integer a, Integer b) {
	System.out.println("3");
}
Keyin biz hali ham 2 ni ko'ramiz. Chunki bu holda primitivlar Integerdagi boksdan ko'ra aniqroq mos keladi. Biroq, agar biz bajarsak, method(new Integer(1), new Integer(2));u chop etadi 3. Java'dagi konstruktorlar usullarga o'xshash va ular imzo olish uchun ham ishlatilishi mumkinligi sababli, ularga haddan tashqari yuklangan usullar kabi bir xil "ortiqcha yuklanish ruxsati" qoidalari qo'llaniladi. Java tilining spetsifikatsiyasi bizga " 8.8.8. Konstruktorni haddan tashqari yuklash "da aytadi. Usulning haddan tashqari yuklanishi = Erta ulanish (aka Statik bog'lash) Statik bog'lash yoki dinamik bog'lash deb ham ataladigan erta va kech ulanish haqida tez-tez eshitishingiz mumkin. Ularning orasidagi farq juda oddiy. Erta - kompilyatsiya, kech - dastur bajarilgan payt. Shuning uchun, erta bog'lash (statik bog'lash) - bu kompilyatsiya vaqtida qaysi usul kimga chaqirilishini aniqlash. Xo'sh, kechikish (dinamik bog'lanish) - bu dasturni bajarish vaqtida to'g'ridan-to'g'ri qaysi usulni chaqirish kerakligini aniqlash. Yuqorida ko'rganimizdek (biz IOExceptionni EOFException ga o'zgartirganimizda), agar biz usullarni haddan tashqari yuklasak, shunda kompilyator qaysi qo'ng'iroqni qayerda amalga oshirishni tushunolmasa, biz kompilyatsiya vaqtida xatoga duch kelamiz: usulga havola noaniq. Ingliz tilidan tarjima qilingan ambiguous so'zi noaniq yoki noaniq, aniq emas degan ma'noni anglatadi. Ma'lum bo'lishicha, ortiqcha yuk erta bog'lanishdir, chunki tekshirish kompilyatsiya vaqtida amalga oshiriladi. Xulosalarimizni tasdiqlash uchun " 8.4.9. Haddan tashqari yuklash " bo'limida Java tili spetsifikatsiyasini ochamiz :
Polimorfizm va uning do'stlari - 10
Ma'lum bo'lishicha, kompilyatsiya paytida argumentlarning turlari va soni haqidagi ma'lumotlar (kompilyatsiya vaqtida mavjud) usulning imzosini aniqlash uchun ishlatiladi. Agar usul ob'ekt usullaridan biri bo'lsa (ya'ni, misol usuli), haqiqiy usul chaqiruvi dinamik usulni qidirish (ya'ni, dinamik bog'lash) yordamida ish vaqtida aniqlanadi. Aniqroq bo'lishi uchun keling, yuqorida muhokama qilinganiga o'xshash misolni olaylik:
public class HelloWorld {
    public void method(int intNumber) {
        System.out.println("intNumber");
    }
    public void method(Integer intNumber) {
        System.out.println("Integer");
    }
    public void method(String intNumber) {
        System.out.println("Number is: " + intNumber);
    }

    public static void main(String args[]) {
        HelloWorld test = new HelloWorld();
        test.method(2);
    }
}
Keling, ushbu kodni HelloWorld.java fayliga saqlaymiz va uni yordamida kompilyatsiya qilamiz. javac HelloWorld.java Endi kompilyatorimiz bayt kodida nima yozganini ko'rib chiqamiz: buyrug'ini bajarib javap -verbose HelloWorld.
Polimorfizm va uning do'stlari - 11
Aytilganidek, kompilyator kelajakda qandaydir virtual usul chaqirilishini aniqladi. Ya'ni, usul tanasi ish vaqtida aniqlanadi. Ammo kompilyatsiya paytida, barcha uchta usuldan kompilyator eng mosini tanladi, shuning uchun u raqamni ko'rsatdi:"invokevirtual #13"
Polimorfizm va uning do'stlari - 12
Bu qanday usul? Bu usulga havola. Taxminan aytganda, bu ish vaqtida Java virtual mashinasi qaysi usulni bajarish kerakligini aniqlay oladigan ba'zi bir maslahatdir. Batafsil ma'lumotni super maqolada topishingiz mumkin: " JVM ichki yuklash va bekor qilish usulini qanday boshqaradi ?".

Xulosa qilish

Shunday qilib, biz Java ob'ektga yo'naltirilgan til sifatida polimorfizmni qo'llab-quvvatlashini aniqladik. Polimorfizm statik (Statik bog'lanish) yoki dinamik (Dynamic Binding) bo'lishi mumkin. Erta bog'lanish deb ham ataladigan statik polimorfizm bilan kompilyator qaysi usulni va qaerda chaqirilishi kerakligini aniqlaydi. Bu ortiqcha yuk kabi mexanizmdan foydalanishga imkon beradi. Dinamik polimorfizm, shuningdek, kechikish deb ham ataladigan, usulning oldindan hisoblangan imzosiga asoslangan holda, usul qaysi ob'ekt ishlatilganiga (ya'ni, qaysi ob'ekt usuli chaqirilganiga) qarab ish vaqtida hisoblab chiqiladi. Ushbu mexanizmlar qanday ishlashini bayt-kod yordamida ko'rish mumkin. Haddan tashqari yuk usul imzolarini ko'rib chiqadi va ortiqcha yukni hal qilishda eng aniq (eng aniq) variant tanlanadi. Qaysi usullar mavjudligini aniqlash uchun turga e'tibor qaratadi va usullarning o'zi ob'ekt asosida chaqiriladi. Shuningdek, mavzu bo'yicha materiallar: #Viacheslav
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION