JavaRush /Java Blog /Random-TK /mysal we miras esaslary

mysal we miras esaslary

Toparda çap edildi
Salam! Öňki leksiýalarda miras düşünjesine eýýäm birnäçe gezek duş geldik. Bu gün bu mowzuga-da degip geçeris, ýöne gaty çuňňur däl. Soňra bu barada jikme-jik leksiýa bolar, ýöne bu gün diňe amaly mysallara serederis we Java-da bir gyzykly operator bilen tanyşarys.

Java mirasy

Onda miras näme? mysal we miras esaslary - 1Miras , programmirlemekde, şol sanda Java-da bar bolan birine esaslanýan täze synpy suratlandyrmaga mümkinçilik berýän mehanizmdir. Nesil synpy soňra ene synpyň meýdanlaryna we usullaryna girip biler. Näme üçin bu zerur bolup biler? Mysal üçin, programmada awtoulaglaryň birnäçe synpyny döretmelidigini göz öňüne getiriň: uckük awtoulag, ýaryş, Sedan, pikap we ş.m. Kod ýazmaga başlamazdanam, bu synplaryň umumylyklarynyň köpdügini anyk bilýärsiňiz: ähli awtoulaglaryň model ady, öndürilen ýyly, hereketlendirijiniň ululygy, iň ýokary tizlik we ş.m. (hemmesiniň tigirleriniň we beýleki bölekleriniň bardygyny aýtmaly däl). Şeýle ýagdaýda edip bilersiňiz:
  • Bu meýdanlary her synpda dörediň we döredilende täze awtoulag synplaryna goşuň
  • Machineshli maşynlar üçin umumy meýdanlary ene synpyna geçiriň Carwe aýratyn maşynlaryň ähli synplary Carsözüň ulanylmagyndan miras alýar .
Ikinji wariant, elbetde has amatly:
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);
   }
}
Iň bolmanda, koduň gereksiz köpeldilmeginden gaça durduk we programmalar ýazylanda hemişe ymtylmaly zadymyz. Mundan başga-da, bizde ýönekeý we düşnükli synp gurluşy bar: ähli maşynlara umumy meýdanlar bir synpda ýerleşdirilýär. Mysal üçin, ýük awtoulaglarynda beýleki awtoulaglarda ýok belli bir meýdan bar bolsa, olary yglan edip bolar Truck. Usullarda-da edil şonuň ýaly. Carshli awtoulaglarda düşündirip boljak umumy häsiýet bar: ulagy, gaz / tormoz we ş.m. Bu umumy usullar umumy synpda ýerleşdirilip bilner Carwe her bir aýratyn görnüşiň aýratyn häsiýeti nesil synplarynda beýan edilip bilner.
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();
   }
}
Carshli awtoulaglaryň umumy usullaryny synpa geçirdik Car. Formöne Formula 1 ýaryş awtoulaglaryny suratlandyrýan mirasdüşer synpynda F1Cardiňe ýaryşda amala aşyrylýan we aýratyn hereketleri bilen tapawutlanýan çukur duralgalary (awtoulagyň gyssagly hyzmaty üçin duralgalar).

Java mysal operatory

Obýektiň synp esasynda döredilendigini ýa-da ýokdugyny barlamak üçin Java-da ýörite operator bar - instanceof. trueSynag dogry bolsa ýa-da falsenetije ýalňyş bolsa , bahany yzyna gaýtaryp berýär . Mysal hökmünde awtoulag synplarymyzy ulanyp nähili işleýändigini göreliň:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Çykyş: dogry Operatoryň kömegi bilen barlanyldy instanceof, truesebäbi synpda bir obýektimiz bar Truckwe ähli ýük awtoulaglary awtoulag. Bu synp Trucksynpyň neslidir Car, şonuň üçin ähli ýük awtoulaglary umumy ene-atanyň - awtoulagyň esasynda döredilýär. Operatora üns beriň instanceof: usul däl-de, operator bolany üçin nokat bolmazdan ýazylýar (“Synpyň obýekti”). Başgaça synap göreliň:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Çykyş: ýalan Synp Carwe şoňa görä-de onuň obýekti synpdan gelenok. TruckAllhli ýük awtoulaglary awtoulag, ýöne awtoulaglaryň hemmesi ýük däl. Obýektler Carsynpyň esasynda döredilmeýär Truck. Moreene bir mysal:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Çykyş: Hakyky Bu ýerdäki logika hem ýönekeý: Java-daky ähli synplar, şol sanda döreden synplaryňyz bir synpdan gelýär Object(ýazmasaňyz, obýekti giňeldýär - bu mehanizm olarda doly däl). Näme üçin bu peýdaly bolup biler we haýsy ýagdaýlarda? Operatoryň iň köp ulanylýan instanceofusuly ýok etmek usulydyr equals(). Mysal üçin, usulyň equalssynpda nähili durmuşa geçirilýändigi 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;
}
Geçirilen obýekt bilen setiri deňeşdirmezden ozal, usul barlanýar: geçen obýekt aslynda setirmi? Diňe şondan soň iki jisimiň häsiýetlerini deňeşdirip başlaýar. Bu barlag bolmasa, gymmaty we uzynlygy meýdanlary bolan islendik obýekti usula geçirip, ony setir bilen deňeşdirip bilersiňiz , bu, elbetde, ýalňyş bolar.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION