JavaRush /Java blogi /Random-UZ /instanceof va meros asoslari

instanceof va meros asoslari

Guruhda nashr etilgan
Salom! Oldingi ma'ruzalarda biz meros tushunchasiga bir necha bor qisqacha duch kelganmiz. Bugun biz ushbu mavzuga ham to'xtalamiz, lekin juda chuqur emas. Bu haqda keyinroq batafsil ma'ruza bo'ladi, lekin bugun biz amaliy misollarni ko'rib chiqamiz va Java tilidagi bitta qiziqarli operator bilan tanishamiz.

Java merosi

Xo'sh, meros degani nima? instanceof va meros asoslari - 1Meros - bu dasturlashdagi mexanizm, shu jumladan Java, mavjud sinfga asoslangan yangi sinfni tavsiflash imkonini beradi. Keyinchalik avlod sinfi ota-klassning maydonlari va usullariga kirish huquqiga ega bo'ladi. Nima uchun bu kerak bo'lishi mumkin? Masalan, dasturda bir nechta avtomobil sinflarini yaratishingiz kerakligini tasavvur qiling: yuk mashinasi, poyga, sedan, pikap va boshqalar. Kod yozishni boshlamasdan ham, siz aniq bilasizki, bu sinflar juda ko'p umumiy xususiyatlarga ega: barcha avtomobillar model nomi, ishlab chiqarilgan yili, dvigatel hajmi, maksimal tezligi va boshqalarga ega. (ularning barchasida g'ildirak va boshqa qismlar borligini aytmasa ham bo'ladi). Bunday vaziyatda siz:
  • Har bir sinfda ushbu maydonlarni yarating va ular yaratilganda ularni yangi avtomobil sinflariga qo'shing
  • Barcha mashinalar uchun umumiy maydonlarni ota-klassga o'tkazing Carva ma'lum turdagi mashinalarning barcha sinflari kengaytirilganCar so'zni ishlatishdan meros bo'lib o'tadi .
Ikkinchi variant, albatta, ancha qulayroq:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Hech bo'lmaganda, biz kodni keraksiz takrorlashdan qochdik va bu biz dasturlarni yozishda doimo harakat qilishimiz kerak bo'lgan narsadir. Bundan tashqari, bizda oddiy va tushunarli sinf tuzilmasi mavjud: barcha mashinalar uchun umumiy maydonlar bitta sinfga joylashtirilgan. Agar, masalan, yuk mashinalarida boshqa avtomobillarda yo'q bo'lgan o'ziga xos maydonlar bo'lsa, ular Truck. Xuddi shu narsa usullarga ham tegishli. Barcha mashinalar tavsiflanishi mumkin bo'lgan umumiy xatti-harakatlarga ega: mashinani ishga tushirish, gaz/tormoz va h.k. Ushbu umumiy usullar umumiy sinfga joylashtirilishi mumkin Carva har bir o'ziga xos turdagi o'ziga xos xatti-harakatlar avlod sinflarida tasvirlanishi mumkin.
public class Car {

   public void gas() {
       //...gas
   }

   public void brake() {
       //...brake
   }
}


public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Biz barcha avtomobillarning umumiy usullarini sinfga o'tkazdik Car. Ammo Formula 1 poyga avtomobillarini tavsiflovchi voris sinfida F1Car- pit-stoplar (avtomobilga shoshilinch texnik xizmat ko'rsatish uchun to'xtash joylari), ular faqat poygada amalga oshiriladi va o'ziga xos xatti-harakatlari bilan ajralib turadi.

Java instanceof operatori

Ob'ekt sinf asosida yaratilganligini tekshirish uchun Java-da maxsus operator mavjud - instanceof. trueAgar test to'g'ri bo'lsa yoki falsenatija noto'g'ri bo'lsa, u qiymatni qaytaradi . Keling, misol sifatida bizning avtomobil sinflarimizdan foydalangan holda qanday ishlashini ko'rib chiqaylik:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Chiqish: rost Operator yordamida tekshirish instanceofqaytarildi true, chunki bizda sinf ob'ekti bor Truckva barcha yuk mashinalari avtomobillardir. Sinf Trucksinfning avlodidir Car, shuning uchun barcha yuk mashinalari umumiy ota-ona - avtomobil asosida yaratilgan. Operatorga e'tibor bering instanceof: u nuqtasiz yoziladi, chunki u usul emas, balki operatordir ("Ob'ekt instanceof Class"). Keling, boshqacha harakat qilaylik:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Chiqish: noto'g'ri Sinf Carva shunga mos ravishda uning ob'ekti sinfdan kelib chiqmaydi Truck.Barcha yuk mashinalari engil avtomobillar, lekin hamma avtomobillar yuk mashinalari emas. Ob'ektlar Carsinf asosida yaratilmaydi Truck. Yana bir misol:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Natija: To'g'ri Bu erda mantiq ham oddiy: Java-dagi barcha sinflar, shu jumladan siz yaratgan sinflar ham bir sinfdan keladi (garchi siz ularda ob'ektni kengaytirishniObject yozmasangiz ham - bu mexanizm ularda yashirindir). Nima uchun bu foydali bo'lishi mumkin va qanday sharoitlarda? Operatordan eng keng tarqalgan foydalanish usuli bekor qilish sifatida . Misol uchun, bu usul sinfda qanday amalga oshirilganligi : instanceofequals()equalsString
public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
O'tkazilgan ob'ekt bilan satrni solishtirishdan oldin, usul tekshiradi: o'tkazilgan ob'ekt aslida satrmi? Va shundan keyingina u ikkita ob'ektning xususiyatlarini solishtirishni boshlaydi. Ushbu tekshiruvsiz siz qiymat va uzunlik maydonlariga ega bo'lgan har qanday ob'ektni usulga o'tkazishingiz va uni satr bilan taqqoslashingiz mumkin, bu, albatta, noto'g'ri.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION