JavaRush /Java блогу /Random-KY /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, анткени бизде класстын an objectи бар Truckжана бардык жүк ташуучу унаалар жеңил унаалар. Класс Truckкласстын тукуму болуп саналат Car, ошондуктан, бардык жүк ташуучу унаалар жалпы ата-эне - унаанын негизинде түзүлгөн. Операторго көңүл буруңуз instanceof: ал чекитсиз жазылган, анткени ал метод эмес, оператор ("an object instanceof Class"). Башкача аракет кылалы:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Чыгуу: false Класс 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 жазбасаңыз да - бул механизм аларда ачык эмес). Бул эмне үчүн пайдалуу болушу мүмкүн жана кандай шарттарда? Оператордун эң кеңири колдонулушу бул ыкманы жокко чыгаруу болуп саналат . Мисалы, бул жерде метод класста кантип ишке ашырылат : 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;
}
Өткөрүлгөн an object менен сапты салыштыруудан мурун, метод текшерет: өткөн an object чындыгында саппы? Ошондо гана ал эки an objectтин касиеттерин салыштыра баштайт. Бул текшерүүсүз, сиз баалуулук жана узундук талаалары бар каалаган an objectти методго өткөрүп , аны сап менен салыштырсаңыз болот, бул, албетте, туура эмес.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION