Салам! Мурунку лекцияларда биз мурас түшүнүгүнө бир нече жолу кыскача жолукканбыз. Бүгүн биз бул темага да токтолобуз, бирок өтө терең эмес. Бул тууралуу кийинчерээк кеңири лекция болот, бирок бүгүн биз практикалык мисалдарды карап чыгабыз жана Javaдагы бир кызыктуу оператор менен таанышабыз.
Java мурас
Демек, мурас деген эмне? Мурас - бул программалоодогу механизм, анын ичинде 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
жазбасаңыз да - бул механизм аларда ачык эмес). Бул эмне үчүн пайдалуу болушу мүмкүн жана кандай шарттарда? Оператордун эң кеңири колдонулушу бул ыкманы жокко чыгаруу болуп саналат . Мисалы, бул жерде метод класста кантип ишке ашырылат : instanceof
equals()
equals
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;
}
Өткөрүлгөн an object менен сапты салыштыруудан мурун, метод текшерет: өткөн an object чындыгында саппы? Ошондо гана ал эки an objectтин касиеттерин салыштыра баштайт. Бул текшерүүсүз, сиз баалуулук жана узундук талаалары бар каалаган an objectти методго өткөрүп , аны сап менен салыштырсаңыз болот, бул, албетте, туура эмес.
GO TO FULL VERSION