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:
- Bütün interface metodları kimi
static
metodların dapublic
olduğu fərz edilməlidir. Və bu səbəbdənprivate
və yaprotected
kimi işarələnənstatic
metodlar compile olunmur; - 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]