Interface dəyişənləri üçün aşağıdakı 2 qayda mövcuddur:
- Interface dəyişənlərinin
public
,static
vəfinal
olduğu fərz edilməlidir, aşkar qeyd olunmasa belə. Ona görə də bu dəyişənləriprivate
,protected
və yaabstract
elan etmək istəsək compile xətası alarıq.
- Interface dəyişənləri
final
olduğuna görə onların dəyəri elan edilən zaman mənimsədilməlidir.
Bu qaydalara əsasən interface dəyişənlərinə constant dəyişənlər kimi də baxmaq olar.
Aşağıdakı kod nümunələri bir-birilə ilə ekvivalentdir. 1-ci nümunəki kod compiler tərəfindən 2-ci nümunədəki koda çevrilir:
public interface CanSwim { // example-1 int MAXIMUM_DEPTH = 100; final static boolean UNDERWATER = true; public static final String TYPE = "Submersible"; }
public interface CanSwim { // example-2 public static final int MAXIMUM_DEPTH = 100; public static final boolean UNDERWATER = true; public static final String TYPE = "Submersible"; }
Aşağıdakı kod nümunələri isə compile olunmur:
public interface CanDig { private int MAXIMUM_DEPTH = 100; // DOES NOT COMPILE protected abstract boolean UNDERWATER = false; // DOES NOT COMPILE public static String TYPE; // DOES NOT COMPILE }
Öncəki mövzulardan birində qeyd etmişdik ki, fərqli interface`lərdə eyni abstract
metod olarsa və onlar hər hansı bir class tərəfindən eyni anda implements
edilərsə, class bu metodlardan birini override etdikdə, avtomatik olaraq ikinci metod da override olunmuş hesab edilir. Bəs fərqli interface`lərdə eyni adlı dəyişənlər olarsa və onlar hər hansı bir class tərəfindən eyni anda implements
edilərsə, onda nə baş verəcək? Axı dəyişənlər override edilmir?!
Deməli, compiler implements
zamanı fərqli interface`lərdə eyni adlı dəyişənlər aşkarladıqda heç bir problem olmadan kodu compile edir, amma həmin dəyişəni çağırarkən onun qarşısında interface`in adı aşkar şəkildə qeyd edilməlidir, əks halda compiler dəyişənin hansı interface`ə aid olduğunu təyin edə bilmir və xəta verir:
interface First { String s = "first"; void test(); } interface Second { String s = "second"; void test(); } class Row implements First, Second { public void test() { System.out.println("test"); } public static void main(String[] args) { Row r = new Row(); r.test(); System.out.println(r.s); //DOES NOT COMPILE, reference to s is ambiguous System.out.println(((First)r).s); // first System.out.println(((Second)r).s); // second } }
[topics lang=az]