JavaRush /Kurslar /All lectures for UZ purposes /Tur o'zgarishi. Kengaytirish va toraytirish

Tur o'zgarishi. Kengaytirish va toraytirish

All lectures for UZ purposes
Daraja, Dars
Mavjud

— Salom, Amigo! Bugungi lektsiya mavzusi – tur kengaytirish va toraytirish. Primitiv turlarni kengaytirish va toraytirish bilan 10-darajada tanishgansiz. Bugun biz bu qanday ishlashini sinf ob'ektlari, ya'ni havolali turlar uchun tushuntiramiz.

Bu juda oddiy aslida. Sinf meros zanjirini tasavvur qiling: sinf, uning ota-onasi, ota-onasining ota-onasi va hokazo. Object sinfigacha. T.k. sinf, undan meros qilib olingan sinfning barcha metodlarini o'z ichiga oladi, demak bu sinfning ob'ekti uning ota-ona turlaridan har qandayida o'zgaruvchida saqlanishi mumkin.

Misol:

Kod Izoh
class Animal
{
  public void doAnimalActions(){}
}
class Cat extends Animal
{
  public void doCatActions(){}
}
class Tiger extends Cat
{
  public void doTigerActions(){}
}
Bu yerda uchta sinf e'lon qilingan: hayvon, mushuk va yo'lbars. Mushuk Hayvondan meros oladi. Yo'lbars esa Mushukdan.
public static void main(String[] args)
{
  Tiger tiger = new Tiger();
  Cat cat = new Tiger(); Animal animal = new Tiger(); Object obj = new Tiger();
}
Tiger sinfining ob'ektini har doim ota sinfi turidagi o'zgaruvchiga osongina tayinlash mumkin. Tiger sinfi uchun bu Cat, Animal va Object.

Endi tur kengaytirish va toraytirish nima ekanligini ko'rib chiqamiz.

Agar tayinlash natijasida meros zanjirida yuqoriga (Object turiga) qarab harakat qilinsa, bu tur kengaytirish (yoki upcasting), agar pastga, ob'ekt turiga qarab harakat qilinsa, bu tur toraytirish (yoki downcasting) hisoblanadi.

Meros zanjirida yuqoriga harakat qilish kengaytirish deb ataladi, chunki bu umumiyroq turga olib keladi. Ammo bu bilan meros orqali sinfga qo'shilgan metodlarni chaqirish imkoniyati yo'qoladi.

Kod Izoh
public static void main(String[] args)
{
  Object obj = new Tiger();
  Animal animal = (Animal) obj; Cat cat = (Cat) obj; Tiger tiger = (Tiger) animal; Tiger tiger2 = (Tiger) cat;
}
Tur toraytirishda, tur o'zgartirish operatorini ishlatish kerak, ya'ni biz aniq o'zgartirishni amalga oshiramiz.

Bunda Java mashinasi haqiqatdan ham ushbu ob'ektni o'zgartirishni istagan turingizdan meros olganmi deb tekshiradi.

Ushbu kichik o'zgarish tur o'zgartirishdagi xatolik sonini bir necha barobar kamaytirdi va Java dasturlarining barqarorligini sezilarli darajada oshirdi.

Kod Izoh
public static void main(String[] args)
{
  Object obj = new Tiger();
  if (obj instanceof Cat)
  {
    Cat cat = (Cat) obj;
    cat.doCatActions();
  }
}
Yana yaxshiroq – bu instanceof tekshirishidan foydalanish
public static void main(String[] args)
{
  Animal animal = new Tiger();
  doAllAction(animal);

  Animal animal2 = new Cat();
  doAllAction(animal2);

  Animal animal3 = new Animal();
  doAllAction(animal3);
}

public static void doAllAction(Animal animal)
{
  if (animal instanceof Tiger)
  {
    Tiger tiger = (Tiger) animal;
    tiger.doTigerActions();
  }

  if (animal instanceof Cat)
  {
    Cat cat = (Cat) animal;
    cat.doCatActions();
  }

  animal.doAnimalActions();
}
Nega yaxshiroq ekanini ko'rish uchun chapdagi misolga qarang.

Biz (bizning kodimiz) qaysi turdagi ob'ekt bilan ishlayotganimizni har doim bilmaymiz. Bu o'zgaruvchi (Animal) turi bilan bir xil turdagi ob'ekt yoki har qanday merosxo'r tur (Cat, Tiger) bo'lishi mumkin.

doAllAction metodini ko'rib chiqamiz. U qanday turdagi ob'ektni unga uzatmasangiz ham to'g'ri ishlaydi.

Ya'ni, u Animal, Cat, Tiger uchala turi uchun ham to'g'ri ishlaydi.

public static void main(String[] args)
{
  Cat cat = new Tiger(); Animal animal = cat; Object obj = cat;
}
Bu yerda uchta tayinlashni ko’rib chiqamiz. Ularning barchasi tur kengaytirish misollaridir.

Bu yerda tur o'zgartirish operatori kerak emas, chunki tekshiruv kerak emas. Ob'ekt havolasini har doim uning istalgan asosiy turidagi o'zgaruvchida saqlash mumkin.

— Oh, oxirgi misolda hammasi aniq bo'ldi. Va nima uchun tekshiruv zarurligini va nima uchun tur o'zgartirish kerakligini tushundim.

— Umid qilamanki, shunday. Sizga bir narsaga e'tibor berishni istardim:

Bunday tayinlashda ob'ekt bilan hech narsa sodir bo'lmaydi! Faqat konkret o'zgaruvchi-havo orqali chaqirilishi mumkin bo'lgan metodlar soni o'zgaradi.

Masalan, Cat sinfi o'zgaruvchisi doAnimalActions & doCatActions metodlarini chaqirishga imkon beradi va Tiger sinfida ishlayotgan bo'lsa ham doTigerActions metodini bilmaydi.

— Ha, bu tushunarli. Ko'rinib turibdiki, bu juda oson ekan.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION