Salam! Əvvəlki mühazirələrdə artıq bir neçə dəfə irsiyyət anlayışı ilə qısa şəkildə qarşılaşmışıq. Bu gün biz də bu mövzuya toxunacağıq, həm də çox dərin deyil. Bu barədə daha sonra ətraflı mühazirə olacaq, lakin bu gün biz sadəcə praktiki nümunələrə baxacağıq və Java-da maraqlı bir operatorla tanış olacağıq.
Java varisliyi
Beləliklə, miras dəqiq nədir? Varislik proqramlaşdırmada, o cümlədən Java-da mövcud olana əsaslanaraq yeni sinfi təsvir etməyə imkan verən mexanizmdir. Bundan sonra nəsil sinif ana sinifin sahələrinə və metodlarına giriş əldə edir. Bu niyə lazım ola bilər? Yaxşı, məsələn, proqramda bir neçə avtomobil sinfi yaratmağınız lazım olduğunu düşünün: Yük maşını, Yarış, Sedan, Pikap və s. Kod yazmağa başlamasanız belə, əmin bilirsiniz ki, bu siniflərin çoxlu ortaq cəhətləri var: bütün avtomobillərin model adı, istehsal ili, mühərrik ölçüsü, maksimal sürət və s. (onların hamısının təkərləri və digər hissələrinin olması faktını nəzərə almasaq). Belə bir vəziyyətdə siz edə bilərsiniz:- Hər sinifdə bu sahələri yaradın və yaradılan zaman onları yeni avtomobil siniflərinə əlavə edin
- Bütün maşınlar üçün ümumi olan sahələri ana sinifə köçürün
Car
və xüsusi tipli maşınların bütün sinifləri genişləndirməCar
sözünü istifadə edərək miras alır .
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);
}
}
Ən azı, kodun lazımsız təkrarlanmasının qarşısını almışıq və bu, proqramlar yazarkən həmişə çalışmalıyıq. Bundan əlavə, sadə və başa düşülən bir sinif quruluşumuz var: bütün maşınlar üçün ümumi olan sahələr bir sinifdə yerləşdirilir. Məsələn, yük maşınlarında digər avtomobillərdə olmayan bəzi xüsusi sahələr varsa, onlar Truck
. Eyni şey üsullara da aiddir. Bütün avtomobillərin təsvir edilə bilən ümumi davranışları var: maşını işə salmaq, qaz/əyləc və s. Bu ümumi metodlar ümumi sinifə yerləşdirilə bilər Car
və hər bir xüsusi növün spesifik davranışı nəsil siniflərində təsvir edilə bilər.
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();
}
}
Bütün avtomobillərin ümumi üsullarını sinifə köçürdük Car
. Lakin Formula 1 yarış avtomobillərini təsvir edən varis sinfində F1Car
- pit-stoplar (avtomobilə təcili texniki qulluq üçün dayanacaqlar), yalnız yarışda həyata keçirilir və spesifik davranışı ilə seçilir.
Java operatorunun nümunəsi
Obyektin sinif əsasında yaradılıb-yaradılmadığını yoxlamaq üçün Java-da xüsusi operator var -instanceof
. true
Test doğrudursa və ya false
nəticə yanlışdırsa, dəyəri qaytarır . Nümunə olaraq avtomobil siniflərimizdən istifadə edərək bunun necə işlədiyini görək:
public class Truck extends Car {
public static void main(String[] args) {
Truck truck = new Truck();
System.out.println(truck instanceof Car);
}
}
Çıxış: doğru Operatordan istifadə edərək çek instanceof
qaytarıldı true
, çünki bizdə sinif obyekti var Truck
və bütün yük maşınları avtomobildir. Sinif Truck
sinfin nəslindəndir Car
, buna görə də bütün yük maşınları ümumi bir valideyn - avtomobil əsasında yaradılmışdır. Operatora diqqət yetirin instanceof
: o, metod deyil, operator olduğu üçün nöqtəsiz yazılır (“Sinif obyektinin nümunəsi”). Fərqli şəkildə cəhd edək:
public static void main(String[] args) {
Car car = new Car();
System.out.println(car instanceof Truck);
}
Çıxış: false Sinif Car
və müvafiq olaraq onun obyekti klassından yaranmır. Truck
Bütün yük maşınları minik avtomobilləridir, lakin bütün avtomobillər yük maşını deyil. Obyektlər Car
sinif əsasında yaradılmır Truck
. Daha bir misal:
public static void main(String[] args) {
Car car = new Car();
Truck truck = new Truck();
System.out.println(car instanceof Object && truck instanceof Object);
}
Nəticə: Doğrudur Burada da məntiq sadədir: yaratdığınız siniflər də daxil olmaqla Java-da bütün siniflər bir sinifdən gəlir Object
(baxmayaraq ki, siz yazmadığınız halda Obyekti genişləndirir - bu mexanizm onlarda gizlidir). Bu nə üçün faydalı ola bilər və hansı şəraitdə? Operatordan ən çox istifadə edilən instanceof
üsul ləğvetmə üsuludur equals()
. equals
Məsələn, metodun sinifdə necə tətbiq olunduğu belədir 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;
}
Sətri ötürülən obyektlə müqayisə etməzdən əvvəl metod yoxlayır: ötürülən obyekt həqiqətən sətirdirmi? Və yalnız bundan sonra o, iki obyektin xüsusiyyətlərini müqayisə etməyə başlayır. Bu yoxlama olmadan siz dəyər və uzunluq sahələri olan istənilən obyekti metoda ötürə və onu sətirlə müqayisə edə bilərsiniz, bu, əlbəttə ki, səhv olardı.
GO TO FULL VERSION