Java’da Arayüzler ve Overridding

20. Arayüzler

Arayüz bir sınıf değildir. Arayüz yazmak sınf yazmaya çok benzer ancak ikisi birbirinden farklı konseptlerdir. Sınıf bir nesnenin özelliklerini ve davranışlarını belirtirken; bir arayüz sınıfların barındırdığı davranışları içerir.

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Bütün arayüz metotları sınıflarda tanımlanmalıdır.

Arayüzler sınıflarla şu şekilde benzerlik gösterir:

  • Arayüz sınırsız sayıda metot içerebilir.
  • Arayüzler .java uzantılı dosyalara yazılır ve dosya ile arayüz ismi aynı olmalıdır..
  • Arayüzün bitkodları .class dosyasının içinde yer alır.
  • Arayüzler paketler halinde bulunur.

Ancak bir arayüz bir sınıftan şu yönleriyle ayrılmaktadır.

  • Arayüzün instance’ı alınamaz
  • Arayüz constructor metot barındırmaz.
  • Arayüzün içindeki bütün metotlar soyuttur. 
  • Arayüzler instance alanları bulunduramazlar. Tek bulundurabilecekleri alanlar da hem static hem de final olarak tanımlanmalıdır.
  • Arayüzler sınıflara genişletilemez, sınıflara uygulanırlar.
  • Bir arayüz başka arayüzlerle genişletilebilir

20.1 Arayüzlerin Tanımlanması

Arayüz oluşturmak için interface kelimesi kullanılır. Aşağıdaki örnekte bir tanımlama bulunmaktadır

Örnek:

Kapsüllemeyi anlatan örneği inceleyelim.

resim

–Arayüzler aşağıdaki özelliklere sahiptir

  • Arayüzler kendiliğinden soyuttur. Tanımlama yaparken abstract kelimesini kullanmaya gerek yoktur.
  • Arayüzün içindeki metotlar da soyut olduğundan abstract kelimesine gerek yoktur.
  • Arayüzün içindeki bütün metotlar tam olarak publictir.

Örnek:

resim

20.2 Arayüzlerin Uygulanması

Bir sınıfın arayüzü çalışıtmasını; arayüzün bütün davranışlarını yapmayı kabul ettiği bir kontratı imzalamak olarak düşünebilirsiniz.Eğer sınıf arayüzün bütün davranışlarını gerçekleştirmiyorsa, kendini soyut olarak tanımlamalıdır.

Bir sınıf arayüzü uygulamak için implements kelimesini kullanır. Implements kelimesi sınıf tanımlanmasında kullanılır ve devamında extends kısmı gelir.

resim

Aşağıdaki sonuç oluşacaktır.

resim

Bir arayüz yazarken uyulması gereken kurallar şunlardır.

  • Bir sınıf birden fazla arayüz uygulayabilir.
  • Bir sınıf sadece bir sınıfa genişletilebilir ancak bir çok arayüze
    genişletilebilir
  • Bir arayüz; sınıfların yaptığı gibi diğer arayüzlere genişletilebilir

Arayüzlerin Genişletilmesi

Bir arayüz; sınıfların yaptığı gibi diğer arayüzlere genişletilebilir. Extends keyword miraslandırmak için kullanılır. Kelimenin kullanıldığı arayüz ana arayüze doğru genişler.

Aşağıdaki Hockey ve Football arayüzleri Sports arayüzünden genişletilmiştir.

resim
resim2

 

Hockey arayuzunde 4 adet metot vardir ancak iki tanesini Sports’dan miras

alir ,boylelikle Hockey’den genisletilen sinif butun 6 metodu da almis olur. Ayni sekilde Football arayuzunu alan bir sinif 3 metodu Football’dan ikisini de Sports arayuzunden alir.

20.4 Birden Cok Arayuzun Genisletilmesi

Java’da bir sinif sadece bir adet siniftan genisletilebilir. Coklu mirasa izin verilmez. Arayuzler siniflar degildir o yuzden birden fazla arayuze genisletilebilir.

extend kelimesi kullanildiktan sonra genisletilecek ana arayuzler virgullerle ayrilarak yazilir.

Örnegin Hockey hem Sports hem de Event arayuzlerinden genisletilseydi asagidaki gibi tanimlanacakti.

public interface Hockey extends Sports, Event

20.5 Birden Cok Arayuzun Uygulamasi

Java’da bir sinif sadece bir adet siniftan genisletilebilir. Coklu mirasa izin verilmez Arayuzler siniflar degildir o yuzden birden fazla arayuzden genisletilebilir.

implements kelimesi kullanildiktan sonra, kullanilacak arayuzler virgulle ayrilarak yazilir.

Örnek olarak, eger fenerbahce sinifi hem Hockey hem de Football sinifini uygulasaydi; kod asagidaki gibi olmaliydi.

public class fenerbahce implements Football, Hockey{
public void setHomeTeam(String name) {
}

public void setVisitingTeam(String name){
}

public void homeTeamScored (int points) {

}
public void visiting TeamScored(int points){
}
public void endOfQuarter (int quarter){
}
public void homeGoalScored(){
}
public void visitingGoalScored(){
}
public void endOfPeriod(int period) {

}
public void overtimePeriod(int ot) {
}
}

21 Üstüne Yazmak (Overriding)

Bir önceki bölümde süper sınıflar ve alt sınıflardan bahsetmiştik. Eğer bir sınıf bir üst sınıftan bir metodu miras alıyorsa, o metodun üstüne yazmak mümkündür. Ancak metot final olarak tanımlanmamış olmalıdır. Üstüne yazmanın avantajı şudur. Alt sınıfa özel bir metodun davranışını belirlemek. Yanı alt sınıf; ana sınıftan aldığı bir metodu kendi gereksinimlerine göre değiştirebilir. Nesne yönelimli programlamanın koşullarında üstüne yazmak; var olan bir metodun işlevselliğini değiştirmektir.

Örnek:
Örneği inceleyelim:

over

over-2

 

21.1 Üstüne Yazma Kuralları (Overriding Rules)
* Argüman listesi değiştirilen metotla tamamen aynı olmalıdır.
* Geri dönüş tipi aynı olmalıdır.
*Erişim düzeyi değiştirilen metottan daha fazla olamaz. Örneğin süper sınıfın metodu public tanımlandıysa; alt sınıfta değiştirilecek metot public veya private olamaz.
* final olarak tanımlanan bir metot değiştirilemez.
* static olarak tanımlanan bir metot değiştirilemez
* Bir metot miras alınamıyorsa değiştirilemez
* Constructor metotlar değiştirilemez.
21.2 Super Kelimesinin Kullanılması
Değiştirilen bir metodun süper sınıf versiyonu çağırılıyorsa super kelimesi kullanılmalıdır.

 

over-3