CodeGym /Kurslar /JAVA 25 SELF /İnterfeys anlayışı, elan sintaksisi

İnterfeys anlayışı, elan sintaksisi

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. İnterfeys nədir?

Əgər abstrakt sinif — evin çertyoju ilə müqayisə edilə bilərsə, interfeys — daha çox müəyyən işlərin yerinə yetirilməsi barədə bir müqavilə və ya “kontrakt”dır. Məsələn, siz santexnik çağırırsınızsa, ondan “kranı təmir etmək” və “sızıntını aradan qaldırmaq” bacarığını gözləyirsiniz. Bunu necə edəcəyi — sizi maraqlandırmır, əsas odur ki, nəticə olsun. Java-da interfeys məhz belə bir kontraktdır: hansı metodların reallaşdırılmalı olduğunu deyir, amma necə — demir.

Qısa və məğzinə varaq:

İnterfeys — Java-da xüsusi tipdir, hansı ki, bu interfeysə “abunə olan” siniflərin mütləq reallaşdırmalı olduqları metodların dəstini müəyyən edir.

  • İnterfeys yalnız “nə etmək lazımdır”ı təsvir edir, amma “necə etmək”i yox.
  • Java 8-dən əvvəl interfeyslərdə metodların reallaşdırılması olmurdu.
  • İnterfeys — təmiz kontraktdır: sinif interfeysi reallaşdırırsa, onun bütün metodlarını da reallaşdırmalıdır.

Bu niyə rahatdır?

  • Bir sinifə bir neçə interfeys “taxmaq” olar — yəni ona bir neçə “rol” vermək olar.
  • Müxtəlif imkanları reallaşdıra bilən siniflərlə çevik və genişlənə bilən arxitekturalar qurmağa imkan verir.
  • İnterfeyslər Java-nın standart kitabxanasında geniş istifadə olunur (məsələn, Comparable, Serializable, Runnable və s.).

2. İnterfeysin elan edilməsi sintaksisi

Java-da interfeys elan etmək çox asandır. Bunun üçün interface açar sözü istifadə olunur. Java 8-dən əvvəl interfeys metodları susmaya görə public abstract hesab olunurdu, hətta bunu açıq yazmasanız belə. Bu o deməkdir: metod interfeysi reallaşdıran sinifdə reallaşdırılmalıdır.

İnterfeys nümunəsi


public interface Movable {
    void move(int x, int y);
}
  • Burada biz Movable interfeysini elan etdik (təxmini “hərəkət edən” və ya “hərəkət edə bilən” kimi tərcümə oluna bilər).
  • Daxildə move(int x, int y) metodu elan edilib. Metodun gövdəsi yoxdur — yalnız siqnatı var. Bu da “kontrakt”dır: “əgər Movable-ı reallaşdırırsansa — zəhmət olmasa, move-u reallaşdır”.

Sintaksisin xüsusiyyətləri

  • İnterfeys metodlarının gövdəsi olmur (Java 8-ədək).
  • İnterfeys metodlarının hamısı susmaya görə public abstract-dır (bunu ayrıca yazmaya bilərsiniz).
  • İnterfeys yalnız konstantalar (public static final) saxlaya bilər, adi sahələr yox.

Konstanta nümunəsi

public interface Constants {
    int MAX_SPEED = 100; // susmaya görə public static final
}

3. İnterfeyslə sinif arasındakı fərq

İnterfeys — sinif deyil! Gəlin fərqin nədə olduğunu anlayaq.

Sinif (abstrakt da daxil olmaqla) İnterfeys
Sahələr (vəziyyət) saxlaya bilər Sahə saxlaya bilməz (yalnız konstantalar)
Metodların reallaşdırmasını saxlaya bilər Java 8-ədək interfeyslər reallaşdırma saxlaya bilmirdi, yalnız siqnaturlar
new vasitəsilə yaradıla bilər (əgər abstrakt deyilsə) Birbaşa yaratmaq olmaz
Yalnız bir irsiyyət (extends) Sinif bir neçə interfeysi reallaşdıra bilər (implements)
“Nədir” üçün istifadə olunur “Nə edə bilir” üçün istifadə olunur

Sinif interfeysi aşağıdakının köməyi ilə reallaşdırır: implements

public class Robot implements Movable {
    @Override
    public void move(int x, int y) {
        System.out.println("Robot (" + x + ", " + y + ") nöqtəsinə hərəkət edir");
    }
}
  • Robot sinfi Movable interfeysini reallaşdırır.
  • implements açar sözü — “reallaşdırır”.
  • İnterfeysin bütün metodlarını mütləq reallaşdırmaq lazımdır (əks halda kompilyasiya xətası olacaq).
  • @Override annotasiyasını unutmayın — məcburi deyil, amma həm kompilyatora, həm də sizə səhv etməməyə kömək edir.

4. İnterfeysdən istifadə nümunəsi

Gəlin sadə bir nümunə yazaq ki, bunun real həyatda necə işlədiyini görək. Təsəvvür edin ki, bizim Movable interfeysimiz var və müxtəlif siniflərin “hərəkət etməsi”ni istəyirik: robot, avtomobil, heyvan...

Addım 1. İnterfeysi elan edirik

public interface Movable {
    void move(int x, int y);
}

Addım 2. İnterfeysi sinifdə reallaşdırırıq

public class Robot implements Movable {
    @Override
    public void move(int x, int y) {
        System.out.println("Robot (" + x + ", " + y + ") nöqtəsinə hərəkət edir");
    }
}

Addım 3. İnterfeysdən istifadə edirik

public class Main {
    public static void main(String[] args) {
        Movable m = new Robot(); // İnterfeys tipli dəyişən!
        m.move(10, 20); // Çıxış: Robot (10, 20) nöqtəsinə hərəkət edir
    }
}

Diqqət yetirin

  • İnterfeys tipli dəyişən (Movable m) elan edib ona bu interfeysi reallaşdıran sinifin obyektini (new Robot()) təyin edə bilərik.
  • Bu, əslində hansı sinif olduğunu bilmədən, istənilən “hərəkət edən” obyektlə işləyən universallıq yaradır.

Metod reallaşdırılmazsa, kompilyasiya xətası

Error: Class 'Robot' must either be declared abstract or implement abstract method 'move(int, int)' in 'Movable'

Bu, interfeysin gücüdür — o, zəmanət verir ki, bütün reallaşdıran siniflər lazım olan metodlara malik olacaq.

5. Java-nın standart kitabxanasında interfeyslər

İnterfeyslər sadəcə “dərslik” mövzusu deyil. Onlar bütün standart Java kitabxanasında fəal şəkildə istifadə olunur. Bir neçə nümunə:

  • Comparable<T> — obyektləri müqayisə etmək üçün interfeys (məsələn, çeşidləmə zamanı).
  • Runnable — axını (thread) başlatmaq üçün interfeys.
  • Serializable — obyektin seriyalaşdırıla biləcəyini göstərən marker-interfeys.
  • List, Set, Map — kolleksiya interfeysləri.

Nümunə: Comparable

public class Person implements Comparable<Person> {
    String name;
    int age;

    // Konstruktor və digər metodlar...

    @Override
    public int compareTo(Person other) {
        return this.age - other.age;
    }
}

İndi Person obyektlərini çeşidləmək olar, çünki onlar Comparable interfeysini reallaşdırır.

6. Vizual sxem: interfeys necə işləyir

+-------------------+         +-------------------+
|   interface       |         |    class          |
|   Movable         |<--------|    Robot          |
|-------------------|         |-------------------|
| +move(int, int)   |         | +move(int, int)   |
+-------------------+         +-------------------+
  • Ox göstərir ki, Robot sinfi Movable interfeysini reallaşdırır.
  • İnterfeys yalnız “nə olmalıdır”ı müəyyən edir, sinif isə “bu necə işləyir”i.

Həyatdan analogiya

Java-dakı interfeys sürücülük vəsiqəsi kimidir. Əgər sizdə vəsiqə varsa (siz “Sürücü” interfeysini reallaşdırmısınız), deməli, avtomobili idarə etməyi bacarırsınız. Necə idarə etməyiniz — artıq detaldır: kimsə ehtiyatla sürür, kimsə sürətlə, amma əsas odur ki, bunu etməyi bacardığınızı təsdiqləmisiniz.

7. Praktik nümunə: tətbiqimizi davam etdiririk

public interface Movable {
    void move(int x, int y);
}

public class Animal implements Movable {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    @Override
    public void move(int x, int y) {
        System.out.println(name + " (" + x + ", " + y + ") nöqtəsinə hərəkət edir");
    }
}

public class Robot implements Movable {
    private String model;

    public Robot(String model) {
        this.model = model;
    }

    @Override
    public void move(int x, int y) {
        System.out.println("Robot " + model + " koordinatlara (" + x + ", " + y + ") doğru gedir");
    }
}

public class Main {
    public static void main(String[] args) {
        Movable[] movables = {
            new Animal("Barsik"),
            new Robot("R2D2")
        };

        for (Movable m : movables) {
            m.move(5, 10);
        }
    }
}

Nəticə:

Barsik (5, 10) nöqtəsinə hərəkət edir
Robot R2D2 koordinatlara (5, 10) doğru gedir

Biz Movable tipli obyektlərdən ibarət massiv yaratdıq. Onun daxilində bu interfeysi reallaşdıran istənilən obyekt ola bilər! Dövrədəki kod qarşısında konkret nə olduğunu — heyvan, yoxsa robot — bilmir, amma hər birinin move etməyi bacardığını bilir.

8. İnterfeyslərlə işləyərkən tipik səhvlər

Səhv № 1: interfeys obyektini birbaşa yaratmağa cəhd. İnterfeys — kontraktdır, konkret obyekt deyil. new Movable() yazmaq olmaz — bu, kompilyasiya xətası verəcək. İnterfeysi reallaşdıran siniflərin obyektlərini yaratmaq lazımdır.

Səhv № 2: interfeysin bütün metodları reallaşdırılmayıb. Əgər sinif interfeysi reallaşdırır, amma bütün metodlarını reallaşdırmırsa, kompilyator belə xəta verəcək: “Class must either be declared abstract or implement abstract method ...”. Bütün metodları reallaşdırmaq istəmirsinizsə — sinifi abstract kimi elan edin.

Səhv № 3: giriş modifikatorlarını unutmaq. İnterfeys metodları həmişə public-dir (açıq yazılmasa belə). Reallaşdıran sinifdə giriş səviyyəsini azaltmaq olmaz, ona görə metod da public olmalıdır.

Səhv № 4: interfeysə adi sahələr əlavə etmək cəhdi. İnterfeysdə yalnız konstantalar (public static final) elan edilə bilər. Adi (qeyri-statik) sahələr əlavə etmək olmaz.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Xoş gəlmisiniz, Salamlaşma Protokolu!
Xoş gəlmisiniz, Salamlaşma Protokolu!
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Rəssam, Xətlərin və Dairələrin Ustası
Rəssam, Xətlərin və Dairələrin Ustası
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Professor-Kalkulyator və Onun Dəyişməz Həqiqətləri
Professor-Kalkulyator və Onun Dəyişməz Həqiqətləri
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Virtual Ev Heyvanları Ferması
Virtual Ev Heyvanları Ferması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION