OCA Java imtahan mövzuları

Static Interface Methods

Java 8 ilə gələn yeniliklərdən biri də odur ki, artıq interface daxilində static metodlar tanımlamaq mümkündür. Bu metodlar aşkar şəkildə (explicitly) static açar sözü istifadə edərək tanımlanır və class daxilində istifadə etdiyimiz adi static metodlarla demək olar ki, eynidir, aralarında ancaq bir fərq var. Interface daxilində tanımlanan static metodlar həmin interface`i implements edən classlar tərəfindən miras alınmır (is not inherited). Əgər həmin metodu istifadə etmək istəyiriksə, o zaman mütləq metodun əvvəlində interface`in adı qeyd olunmalıdır.

Static metodlar üçün aşağıdakı qaydalar mövcuddur:

  1. Bütün interface metodları kimi static metodların da public olduğu fərz edilməlidir. Və bu səbəbdən private və ya protected kimi işarələnən static metodlar compile olunmur;
  2. Bu static metodlara müraciət etmək üçün mütləq metodun əvvəlində interface`in adı istifadə edilməlidir.

Nümunə:

interface Hop {
    static int getJumpHight() {
        return 7;
    }
}

abstract class Animal {
    static int getSpeed() {
        return 11;
    }
}

public class Dog extends Animal implements Hop {
    public static void main(String[] args) {
        Hop h = new Dog();
        System.out.println("Dog speed is " + getSpeed());
        System.out.println("Dog jump hight is " + getJumpHight());   //DOES NOT COMPILE
        System.out.println("Dog jump hight is " + h.getJumpHight()); //DOES NOT COMPILE
    }
}

Nümunədən də gördüyümüz kimi Dog classı abstract Animal classının static metodunu miras alır, amma Hop interface`nin static metodunu miras almır, ona görə də getJumpHight() metodu compile olunmur. Compile olunması üçün bu metodun adının əvvəlində Hop interface`i aşkar şəkildə qeyd edilməlidir:

public class Dog extends Animal implements Hop {
    public static void main(String[] args) {
        System.out.println("Dog jump hight is " + Hop.getJumpHight());
    }
}

Default metodlar mövzusunda qeyd etdik ki, compiler eyni default metodlar aşkarladıqda xəta verir. Amma eyni static metodlar üçün bu qayda keçərli deyil. Belə ki, compiler implements zamanı fərqli interface`lərdə eyni static metodlar aşkarladıqda heç bir problem olmadan kodu compile edir, çünki static metodlar subclasslar tərəfindən miras alınmır və hər static metoda onun məxsus olduğu interface adı ilə müraciət olunmalıdır:

public interface Interface1 {
    static void staticMethod() {}
}

public interface Interface2 {
    static void staticMethod() {}
}

public interface Interface3 extends Interface1, Interface2 {}

public class AnyClass implements Interface1, Interface2 {}

 

[topics lang=az]

About the author

Mushfiq Mammadov

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.