OCA Java imtahan mövzuları

Abstract Methods and Multiple Inheritance

Bildiyimiz kimi java eyni anda bir neçə interface`i implements etməyə icazə verir. O zaman sual yarana bilər ki, bəs fərqli interface`lərdə eyni abstract metod olarsa və onlar hər hansı bir class tərəfindən eyni anda implements edilsə nə baş verəcək?

interface Herbivore {
   public void eatPlants();
}

interface Omnivore {
   public void eatPlants();
   public void eatMeat();
}

public class Bear implements Herbivore, Omnivore {
   public void eatMeat() {
      System.out.println("Eating meat");
   }
   public void eatPlants() {
      System.out.println("Eating plants");
   }
}

Yuxarıdakı kod heç bir compile xətası olmadan çalışacaq. Çünki hər iki metod abstractdır və eyni özəlliyə/davranışa malikdir. Bu halda bu metodlardan birini override etdikdə, avtomatik olaraq ikinci metod da override olunmuş hesab edilir. Başqa sözlə, əgər interface metodları eyni struktura (the same signature) malik olarsa, o zaman onlar dublikat (duplicate) metodlar hesab olunur.

Əgər metodlar fərqli struktura (metod adı eyni, parametr listi fərqli) malik olsalar, o zaman heç bir konflikt olmayacaq, çünki bu artıq metod overloading`dir.

Yox əgər metod adı və parametr listi eyni, amma geri dönüş tipi (return types) fərqli olsa, bu zaman həmin interface`ləri eyni anda implements etdikdə compile xətası baş verəcək. Çünki bir classda eyni ada və parametr siyahısına, lakin fərqli dönüş tipinə malik iki metod tanımlamaq mümkün deyil:

interface Herbivore {
    public int eatPlants();
}

interface Omnivore {
    public void eatPlants();
}

public class Bear implements Herbivore, Omnivore {  // DOES NOT COMPILE
    public int eatPlants() {      // DOES NOT COMPILE
        System.out.println("Eating plants: 15");
        return 15;
    }
    public void eatPlants() {     // DOES NOT COMPILE
        System.out.println("Eating plants");
    }
}

Əgər biz Bear classında override etdiyimiz metodlardan birini silsək, compile xətası yenə də qalacaq. Çünki bu zaman compiler bizə xəbərdarlıq edəcək ki, override olunması tələb olunan metodlardan biri buraxılıb.

Əgər yuxarıdakı nümunələrdə qeyd etdiyimiz interface`lər digər interface və ya abstract class tərəfindən varis alınsa belə yenə compile xətası çıxacaq, çünki compiler override etmədən belə bu problemi aşkarlayır:

interface Herbivore {
   public int eatPlants();
}

interface Omnivore {
   public void eatPlants();
}

interface Supervore extends Herbivore, Omnivore {}   // DOES NOT COMPILE

abstract class AbstractBear implements Herbivore, Omnivore {}  // DOES NOT COMPILE

Qeydlərimin içərisində bu mövzu ilə əlaqəli maraqlı bir suala rast gəldim. Deməli, bu sual 2015-ci ildə Facebookda “Java sertifikat sualları” qrupumuzda paylaşılıb, sual maraqlı olduğu üçün mən də onu “screenshot” edib atmışam qeydlərə. Sual belədir:

Consider these two interfaces:

interface I1 { void m1() throws java.io.IOException; }
interface I2 { void m1() throws java.sql.SQLException; }

What methods have to be implemented by a class that says it implements I1 and I2 ?

A) Both, public void m1() throws SQLException; and public void m1() throws IOException;
B) public void m1() throws Exception
C) The class cannot implement both the interfaces simultaneously as they have conflicting methods.
D) public void m1() throws SQLException, IOException;
E) None of the above.

Sual çətin sualdır, indi baxanda özüm də qarışdırdım. Amma izahını elə o vaxt qrupda yazmışam (link), hazırlıq ərəfəsində daha formada olursan, amma zamanla bəzi mövzular unudulur 🙂 İzaha baxmazdan öncə özünüz tapmağa cəhd edin.

 

[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.