Salam! Əvvəlki mühazirələrdə artıq bir neçə dəfə irsiyyət anlayışı ilə qısa şəkildə qarşılaşmışıq. Bu gün biz də bu mövzuya toxunacağıq, həm də çox dərin deyil. Bu barədə daha sonra ətraflı mühazirə olacaq, lakin bu gün biz sadəcə praktiki nümunələrə baxacağıq və Java-da maraqlı bir operatorla tanış olacağıq.

Java varisliyi

Beləliklə, miras dəqiq nədir? instanceof və miras əsasları - 1Varislik proqramlaşdırmada, o cümlədən Java-da mövcud olana əsaslanaraq yeni sinfi təsvir etməyə imkan verən mexanizmdir. Bundan sonra nəsil sinif ana sinifin sahələrinə və metodlarına giriş əldə edir. Bu niyə lazım ola bilər? Yaxşı, məsələn, proqramda bir neçə avtomobil sinfi yaratmağınız lazım olduğunu düşünün: Yük maşını, Yarış, Sedan, Pikap və s. Kod yazmağa başlamasanız belə, əmin bilirsiniz ki, bu siniflərin çoxlu ortaq cəhətləri var: bütün avtomobillərin model adı, istehsal ili, mühərrik ölçüsü, maksimal sürət və s. (onların hamısının təkərləri və digər hissələrinin olması faktını nəzərə almasaq). Belə bir vəziyyətdə siz edə bilərsiniz:
  • Hər sinifdə bu sahələri yaradın və yaradılan zaman onları yeni avtomobil siniflərinə əlavə edin
  • Bütün maşınlar üçün ümumi olan sahələri ana sinifə köçürün Carvə xüsusi tipli maşınların bütün sinifləri genişləndirməCar sözünü istifadə edərək miras alır .
İkinci seçim, əlbəttə ki, daha əlverişlidir:
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);
   }
}
Ən azı, kodun lazımsız təkrarlanmasının qarşısını almışıq və bu, proqramlar yazarkən həmişə çalışmalıyıq. Bundan əlavə, sadə və başa düşülən bir sinif quruluşumuz var: bütün maşınlar üçün ümumi olan sahələr bir sinifdə yerləşdirilir. Məsələn, yük maşınlarında digər avtomobillərdə olmayan bəzi xüsusi sahələr varsa, onlar Truck. Eyni şey üsullara da aiddir. Bütün avtomobillərin təsvir edilə bilən ümumi davranışları var: maşını işə salmaq, qaz/əyləc və s. Bu ümumi metodlar ümumi sinifə yerləşdirilə bilər Carvə hər bir xüsusi növün spesifik davranışı nəsil siniflərində təsvir edilə bilər.
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();
   }
}
Bütün avtomobillərin ümumi üsullarını sinifə köçürdük Car. Lakin Formula 1 yarış avtomobillərini təsvir edən varis sinfində F1Car- pit-stoplar (avtomobilə təcili texniki qulluq üçün dayanacaqlar), yalnız yarışda həyata keçirilir və spesifik davranışı ilə seçilir.

Java operatorunun nümunəsi

Obyektin sinif əsasında yaradılıb-yaradılmadığını yoxlamaq üçün Java-da xüsusi operator var - instanceof. trueTest doğrudursa və ya falsenəticə yanlışdırsa, dəyəri qaytarır . Nümunə olaraq avtomobil siniflərimizdən istifadə edərək bunun necə işlədiyini görək:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Çıxış: doğru Operatordan istifadə edərək çek instanceofqaytarıldı true, çünki bizdə sinif obyekti var Truckvə bütün yük maşınları avtomobildir. Sinif Trucksinfin nəslindəndir Car, buna görə də bütün yük maşınları ümumi bir valideyn - avtomobil əsasında yaradılmışdır. Operatora diqqət yetirin instanceof: o, metod deyil, operator olduğu üçün nöqtəsiz yazılır (“Sinif obyektinin nümunəsi”). Fərqli şəkildə cəhd edək:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Çıxış: false Sinif Carvə müvafiq olaraq onun obyekti klassından yaranmır. TruckBütün yük maşınları minik avtomobilləridir, lakin bütün avtomobillər yük maşını deyil. Obyektlər Carsinif əsasında yaradılmır Truck. Daha bir misal:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Nəticə: Doğrudur Burada da məntiq sadədir: yaratdığınız siniflər də daxil olmaqla Java-da bütün siniflər bir sinifdən gəlir Object(baxmayaraq ki, siz yazmadığınız halda Obyekti genişləndirir - bu mexanizm onlarda gizlidir). Bu nə üçün faydalı ola bilər və hansı şəraitdə? Operatordan ən çox istifadə edilən instanceofüsul ləğvetmə üsuludur equals(). equalsMəsələn, metodun sinifdə necə tətbiq olunduğu belədir String:
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;
}
Sətri ötürülən obyektlə müqayisə etməzdən əvvəl metod yoxlayır: ötürülən obyekt həqiqətən sətirdirmi? Və yalnız bundan sonra o, iki obyektin xüsusiyyətlərini müqayisə etməyə başlayır. Bu yoxlama olmadan siz dəyəruzunluq sahələri olan istənilən obyekti metoda ötürə və onu sətirlə müqayisə edə bilərsiniz, bu, əlbəttə ki, səhv olardı.