JavaRush /Java блогы /Random-KK /instanceof және мұрагерлік негіздері

instanceof және мұрагерлік негіздері

Топта жарияланған
Сәлеметсіз бе! Алдыңғы дәрістерде біз мұрагерлік ұғыммен бірнеше рет қысқаша кездестік. Бүгін біз бұл тақырыпқа да тоқталамыз, бірақ тым терең емес. Бұл туралы кейінірек егжей-тегжейлі дәріс болады, бірақ бүгін біз практикалық мысалдарды қарастырамыз және Java тіліндегі бір қызықты оператормен танысамыз.

Java мұрасы

Сонымен, мұрагерлік дегеніміз не? instanceof және мұрагерлік негіздері - 1Мұрагерлік – бағдарламалаудағы механизм, соның ішінде Java, ол бар класс негізінде жаңа классты сипаттауға мүмкіндік береді. Бұдан кейін ұрпақ класы ата-аналық сыныптың өрістері мен әдістеріне қол жеткізе алады. Бұл не үшін қажет болуы мүмкін? Мысалы, бағдарламада автомобильдердің бірнеше класын жасау керек деп елестетіңіз: Жүк көлігі, Жарыс, Седан, Пикап және т.б. Кодты жазуды бастамасаңыз да, сіз бұл сыныптардың көп нәрсеге ортақ екенін нақты білесіз: барлық автомобильдердің үлгі атауы, шығарылған жылы, қозғалтқыш өлшемі, максималды жылдамдығы және т.б. (олардың барлығында дөңгелектері және басқа бөліктері бар екенін айтпағанның өзінде). Мұндай жағдайда сіз:
  • Әрбір сыныпта осы өрістерді жасаңыз және олар жасалған кезде оларды жаңа автокөлік сыныптарына қосыңыз
  • Барлық машиналарға ортақ өрістерді ата-аналық сыныпқа жылжытыңыз Carжәне машиналардың нақты түрлерінің барлық кластары кеңейтілгенCar сөзді пайдаланудан мұра алады .
Екінші нұсқа, әрине, әлдеқайда ыңғайлы:
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);
   }
}
Кем дегенде, біз codeтың қажетсіз қайталануын болдырмай алдық және бұл бағдарламаларды жазу кезінде әрқашан ұмтылуымыз керек нәрсе. Сонымен қатар, бізде қарапайым және түсінікті класс құрылымы бар: барлық машиналарға ортақ өрістер бір сыныпқа орналастырылған. Егер, мысалы, жүк көліктерінде басқа автомобильдерде жоқ кейбір нақты өрістер болса, оларды Truck. Әдістерге де қатысты. Барлық автомобильдерде сипаттауға болатын жалпы мінез-құлық бар: көлікті іске қосу, газ/тежегіш және т.б. Бұл жалпы әдістерді жалпы сыныпқа орналастыруға болады Carжәне әрбір нақты түрдің ерекше әрекетін ұрпақ сыныптарында сипаттауға болады.
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();
   }
}
Біз барлық машиналарға ортақ әдістерді сыныпқа көшірдік Car. Бірақ Формула 1 жарыс автомобильдерін сипаттайтын мұрагер класында F1Car- пит-стоптар (автокөлікке шұғыл техникалық қызмет көрсетуге арналған аялдамалар), олар тек жарыста жасалады және ерекше мінез-құлықпен ерекшеленеді.

Java операторының данасы

Объектінің класс негізінде жасалғанын тексеру үшін Java тілінде арнайы оператор бар - instanceof. trueОл сынақ ақиқат болса немесе falseнәтиже жалған болса, мәнді қайтарады . Мысал ретінде біздің автокөлік сыныптарын пайдалану арқылы оның қалай жұмыс істейтінін көрейік:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Нәтиже: шын Операторды пайдаланып тестілеу instanceofқайтарылды true, өйткені бізде сыныптың нысаны бар Truckжәне барлық жүк көліктері жеңіл. Класс Truck- бұл сыныптың ұрпағы Car, сондықтан барлық жүк көліктері жалпы ата-ана - автомобиль негізінде жасалған. Операторға назар аударыңыз instanceof: ол нүктесіз жазылады, өйткені ол әдіс емес, оператор («Сыныптың нысан данасы»). Басқаша көрейік:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Шығару: жалған Класс Carжәне сәйкесінше оның an objectісі .Жүк Truckкөліктерінің барлығы жеңіл автомобильдер, бірақ барлық автомобильдер жүк көлігі емес. Объектілер Carкласс негізінде жасалмайды Truck. Тағы бір мысал:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Нәтиже: Ақиқат Мұндағы логика да қарапайым: Java тіліндегі барлық сыныптар, соның ішінде сіз жасағандар, сыныптан келеді (бірақ сіз оларда кеңейтілген Object депObject жазбасаңыз да - бұл механизм оларда жасырын түрде көрсетілген). Неліктен бұл пайдалы болуы мүмкін және қандай жағдайларда? Оператордың ең көп таралған түрі - әдісті қайта анықтау . Мысалы, бұл әдіс сыныпта қалай жүзеге асырылады : 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;
}
Жолды берілген нысанмен салыстырмас бұрын әдіс тексереді: берілген нысан шын мәнінде жол ма? Содан кейін ғана ол екі нысанның қасиеттерін салыстыра бастайды. Бұл тексерусіз сіз мән және ұзындық өрістері бар кез келген нысанды әдіске жібере аласыз және оны жолмен салыстыра аласыз, бұл, әрине, дұрыс емес.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION