1. İrsiyyət nədir?
İrsiyyət — mövcud sinif əsasında onun xüsusiyyət və metodlarını “miras alaraq” yeni sinif yaratmağa imkan verən mexanizmdir. Yeni sinif alt sinif (və ya övlad sinif), ilkin sinif isə valideyn sinif (və ya baza sinif) adlanır.
Bu elə bil ki, siz köhnə resept əsasında yeni tort hazırlayırsınız: ən yaxşıları götürür, bir-iki yeni inqrediyent əlavə edirsiniz — və vuala, artıq “Nənənin resepti ilə gizli inqrediyentli tort”unuz var.
- Valideyn sinif — ümumi xüsusiyyətlər və davranış saxlayır.
- Alt sinif — bunların hamısını miras alır, üstəlik özünəməxsus olanı əlavə edə və ya davranışı dəyişə bilər.
Məsələn, “Pişik — heyvandır”: Bütün pişiklər heyvandır, amma bütün heyvanlar pişik deyil. Heyvan baza sinif, Pişik isə onun alt sinfi ola bilər. Eynilə İt də, məsələn.
Yaxud “Dairə — fiqurdur”: Hər dairə fiqurdur, amma hər fiqur dairə deyil. Fiqur valideyn sinfi ola bilər, Dairə və Üçbucaq isə onun varisləri. Java-da bu əlaqələr extends açar sözü vasitəsilə qurulur.
İrsiyyət nə üçün lazımdır?
Milyonluq sual: niyə sadəcə kodu bir sinifdən digərinə köçürməyək? Ümumiyyətlə irsiyyət niyə icad olunub?
- Kodun təkrar istifadəsi: Bütün ümumi hissə baza sinfə çıxarılır. Sahələri və metodları təkrarlamağa ehtiyac yoxdur — onlar alt siniflərdə avtomatik olaraq mövcud olur. Məsələn, universitet proqramında baza sinif “insan” ola bilər: ən azı adı və doğum günü var, “tələbə” və “müəllim” isə öz xüsusiyyətləri olan alt siniflərdir.
- Genişlətmə və ixtisaslaşma: Lazım olan yerdə yeni sahələr və metodlar əlavə edə və ya mövcud olanları dəyişə bilərsiniz. Bütün heyvanlar səs çıxarır, amma pişik miyavlayacaq, it isə havlayacaq. Bununla yanaşı pişiyə ağaca dırmaşmaq bacarığı əlavə etmək olar (baza sinifdə belə bir bacarıq yoxdur).
- İyerarxiyaların strukturlaşdırılması: Kod daha məntiqli və anlaşılan olur. Məsələn, əgər sizdə Animal, Dog, Cat sinifləri varsa, dərhal görünür ki, Dog və Cat — Animal-ın xüsusi hallarıdır.
Nümunə. Əgər Java-da irsiyyət olmasaydı, eat(), sleep() kimi metodları və name sahəsini hər heyvan sinfinə köçürməli olardınız. Sabah breathe() metodu əlavə etmək lazım gəlsə, onlarla sinfi dəyişməli olacaqdınız! İrsiyyətlə isə — baza sinfinə “nəfəs alma” imkanını əlavə etmək kifayətdir.
2. İrsiyyətin sintaksisi: extends
Java-da irsiyyəti necə elan etmək olar? Çox sadədir: extends açar sözündən istifadə edin.
class RoditelskiyKlass {
// sahələr və metodlar
}
class Podklass extends RoditelskiyKlass {
// əlavə sahələr və metodlar
}
Nümunə 1: Heyvanlar
// Valideyn sinif
class Animal {
String name;
void eat() {
System.out.println(name + " yeyir.");
}
}
// Alt sinif
class Cat extends Animal {
void meow() {
System.out.println(name + " deyir: Miyav!");
}
}
Burada nə baş verir?
- Cat sinfi Animal sinifinin bütün sahə və metodlarını miras alır.
- Deməli, Cat-də artıq name sahəsi və eat() metodu var, baxmayaraq ki, onları açıq şəkildə yazmamışıq.
- Üstəlik, Cat-də özünəməxsus meow() metodu peyda olur.
İstifadə
public class Main {
public static void main(String[] args) {
Cat kitty = new Cat();
kitty.name = "Barsik";
kitty.eat(); // Barsik yeyir. (miras alınıb)
kitty.meow(); // Barsik deyir: Miyav! (öz metodu)
}
}
Vuala! Minimum kodla yeni sinif əldə etdik və təkrarlamadan qaçdıq.
3. Alt sinif konkret nəyi miras alır?
Java-da alt sinif aşağıdakıları miras alır:
- Bütün açıq (public) və qorunan (protected) sahələri və metodları baza sinfinin.
- Bütün package-private sahə və metodları, əgər alt sinif eyni paketdədirsə.
Miras almır:
- Konstruktorlar (alt sinifdə onları açıq şəkildə elan etmək lazımdır).
- Məxfi (private) sahə və metodlar (onlar yalnız baza sinfinin daxilində əlçatandır).
- Statik ilkinləşdirmə blokları (miras alınmır, lakin hər sinifin öz bloku ola bilər).
- package-private girişə malik üzvlər, əgər alt sinif başqa paketdədirsə.
İllüstrasiya
class Animal {
public String name;
private int age;
public void eat() {
System.out.println("Yeyirəm");
}
private void secret() {
System.out.println("Sirr!");
}
}
class Dog extends Animal {
public void bark() {
System.out.println("Hav!");
}
}
- Dog name sahəsini və eat() metodunu miras alacaq.
- Dog görmür age sahəsini və secret() metodunu — onlar private-dir.
4. Java-da irsiyyətin məhdudiyyətləri
Java kifayət qədər sərt bir xanımdır və onun öz qaydaları var:
Yalnız siniflər üçün təkli irsiyyət: hər sinif yalnız bir başqa sinifdən miras ala bilər. Amma bir sinifin istənilən sayda varisi ola bilər.
class Dog extends Animal { ... } // Yaxşı
class Dog extends Animal, Pet { ... } // Xəta! Belə olmaz
İnterfeyslərin çoxlu irsiyyəti — olar, amma bu ayrıca mövzudur, buna sonra qayıdacağıq.
Object sinfi — Java-dakı bütün siniflərin əcdadıdır. Hətta siz açıq şəkildə extends yazmasanız belə, sinfiniz yenə də gizli şəkildə Object-dən miras alır.
5. Praktik nümunə
Gəlin “zooloji” tətbiqimizi qurmağa davam edək.
Addım 1. Baza sinif Animal
class Animal {
String name;
void eat() {
System.out.println(name + " yeyir.");
}
}
Addım 2. Alt sinif Cat
class Cat extends Animal {
void meow() {
System.out.println(name + " deyir: Miyav!");
}
}
Addım 3. Alt sinif Dog
class Dog extends Animal {
void bark() {
System.out.println(name + " deyir: Hav!");
}
}
Addım 4. Siniflərdən istifadə
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "Murka";
cat.eat(); // Murka yeyir.
cat.meow(); // Murka deyir: Miyav!
Dog dog = new Dog();
dog.name = "Sharik";
dog.eat(); // Sharik yeyir.
dog.bark(); // Sharik deyir: Hav!
}
}
Nə əldə etdik?
- Həm Cat, həm də Dog baza sinifdən name sahəsini və eat() metodunu istifadə edir.
- Hər sinif özünəməxsus davranış əlavə edir: pişik üçün meow(), it üçün bark().
- Əgər heyvanların necə yeməsini dəyişmək lazım gələrsə, Animal sinfində eat() metodunu dəyişmək kifayətdir — dəyişikliklər avtomatik olaraq bütün varislərə tətbiq olunacaq.
6. Faydalı nüanslar
Vizualizasiya: sinif iyerarxiyası
İerarxiyanı belə təsəvvür etmək olar:
. Animal
/ \
Cat Dog
- Animal — baza sinif, heyvanlar üçün ümumi olan hər şeyi saxlayır.
- Cat və Dog — alt siniflər, unikal xüsusiyyətlər əlavə edirlər.
Konstruktorlar və irsiyyət haqqında bir az
Konstruktorlar miras alınmır. Əgər alt sinifdə konstruktor təyin etmirsinizsə, Java avtomatik olaraq parametrsiz konstruktor əlavə edəcək (əgər o, valideyndə varsa). Əgər valideyn sinfin yalnız parametrləri olan konstruktoru varsa, alt sinifdə onu mütləq super(...) vasitəsilə açıq şəkildə çağırmaq lazımdır. Qısa nümunə:
class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
class Cat extends Animal {
Cat(String name) {
super(name); // valideyn konstruktorunu çağırırıq
}
}
7. İrsiyyətdən istifadə zamanı tipik xətalar
Xəta № 1: Eyni anda bir neçə sinifdən miras almağa cəhd.
Java-da class Cat extends Animal, Pet yazmaq olmaz. Yalnız bir valideyn!
Xəta № 2: Private sahə və metodların alt sinifdə əlçatan olacağını zənn etmək.
Private üzvlər miras alınmır (daha doğrusu, onlar var, amma alt sinifdən onlara giriş yoxdur). Varislərə giriş vermək lazımdırsa, protected-dan istifadə edin.
Xəta № 3: Valideyn konstruktorunu çağırmağı unutmaq.
Əgər baza sinifdə parametrsiz konstruktor yoxdursa və siz açıq şəkildə super(...) çağırmırsınızsa, kompilyasiya xətası olacaq.
Xəta № 4: İrsiyyətdən “kodu azaltmaq naminə”, məna baxımından yox, istifadə etmək.
Əgər siniflər arasında “is-a” (yəni “A, B-dir”) münasibəti yoxdursa, irsiyyətdən istifadə etməyin. Məsələn, “İnsan” “Avtomobil”dən miras almamalıdır, hər ikisində speed sahəsi olsa belə.
GO TO FULL VERSION