Салом! Дар лекцияхои пештара мо бо мафхуми мерос якчанд маротиба ба таври мухтасар дучор шуда будем. Имрӯз мо низ ба ин мавзӯъ дахл хоҳем кард, аммо на он қадар амиқ. Дар ин бора баъдтар лексияи муфассал хонда мешавад, аммо имрӯз мо танҳо мисолҳои амалиро дида мебароем ва бо як оператори ҷолиб дар Java шинос мешавем.
мероси Java
Пас, мерос аслан чист? Мерос як механизм дар барномасозӣ, аз ҷумла Java мебошад, ки ба шумо имкон медиҳад синфи навро дар асоси синфи мавҷуда тавсиф кунед. Синфи насли он гоҳ ба майдонҳо ва усулҳои синфи волидайн дастрасӣ пайдо мекунад. Чаро ин метавонад зарур бошад? Хуб, масалан, тасаввур кунед, ки шумо бояд дар барнома якчанд синфҳои мошинҳоро эҷод кунед: Truck, Racing, Sedan, Pickup ва ғайра. Ҳатто бидуни сар кардани навиштани code, шумо аниқ медонед, ки ин синфҳо чизҳои умумӣ доранд: ҳама мошинҳо номи модел, соли истеҳсол, андозаи муҳаррик, суръати максималӣ ва ғайра доранд. (дар бораи он, ки хамаи онхо чарху дигар кисмхо доранд). Дар чунин вазъият шумо метавонед:- Ин майдонҳоро дар ҳар як синф эҷод кунед ва ҳангоми сохтани онҳо ба синфҳои нави мошин илова кунед
- Майдонҳои барои ҳама мошинҳо маъмулро ба синфи волидайн интиқол диҳед
Car
ва ҳамаи синфҳои намудҳои мушаххаси мошинҳо азCar
истифодаи калимаи extensions мерос мегиранд .
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
. Аммо дар синфи вориси F1Car
Формула 1, ки мошинҳои пойгаро тавсиф мекунанд - пит-стокҳо (истгоҳҳо барои нигоҳдории таъҷorи мошин), ки танҳо дар мусобиқа анҷом дода мешаванд ва бо рафтори мушаххас фарқ мекунанд.
Java намунаи оператор
Барои санҷидани он ки оё an object дар асоси синф сохта шудааст, дар Java оператори махсус мавҷуд аст -instanceof
. Он арзишро бармегардонад, true
агар санҷиш дуруст бошад ё false
натиҷа нодуруст бошад. Биёед бубинем, ки он бо истифода аз синфҳои автомобorи мо ҳамчун намуна чӣ гуна кор мекунад:
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и мисоли Синф"). Биёед онро ба таври дигар санҷем:
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
(гарчанде ки шумо наменависед Объектро дар онҳо васеъ мекунад - ин механизм дар онҳо номуайян аст). Чаро ин метавонад муфид бошад ва дар кадом ҳолатҳо? Истифодаи маъмултарини оператор 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