Arayüzleri Uygulama
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 35 / 87.
Bir arayüzü kullanmak için, bir sınıfın implements anahtar kelimesini kullanarak onu uygulaması gerekir. Sınıf daha sonra arayüzde tanımlanan tüm metotlar için somut uygulamalar sağlar:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}Eğer bir sınıf bir arayüzü (interface) implement eder ancak tüm metotları için uygulama (implementation) sağlamazsa, derleyici bir hata fırlatacaktır. @Override anotasyonu isteğe bağlıdır ancak hataları yakalamaya yardımcı olduğu için önerilir.
Tıpkı soyut sınıflarda olduğu gibi, bir arayüzü referans türü olarak kullanabilirsiniz. Bu, aynı arayüzü uygulayan farklı sınıfların tek tip olarak ele alınabildiği polimorfizmi mümkün kılar:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // 5.0 yarıçaplı bir daire çiziliyor
shape2.draw(); // 4.0 x 3.0 boyutlarında bir dikdörtgen çiziliyorBu güçlüdür çünkü Drawable referanslarıyla çalışan kodun belirli sınıf türünü bilmesine gerek yoktur. Sadece nesnenin çizilebilir olmasıyla ilgilenir.
Bir sonraki derste, tek bir sınıfın aynı anda birden fazla arayüzü nasıl uygulayabildiğini göreceksiniz.
Görev
KolaySınıfların arayüzleri (interfaces) nasıl uyguladığını gösteren bir hoparlör sistemi oluşturalım. Herhangi bir hoparlörün neler yapabileceğini tanımlayan bir arayüz oluşturacak, ardından bu sözleşmeyi kendi yöntemleriyle uygulayan iki farklı hoparlör türü inşa edeceksiniz.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Speaker.java: Herhangi bir hoparlörün neler yapabilmesi gerektiğini bildirenSpeakeradında bir arayüz tanımlayın. Her hoparlörün bir String döndürenspeak()metoduna sahip olması gerekir; bu, tüm uygulayan sınıfların yerine getirmesi gereken sözleşmedir.Human.java:Speakerarayüzünü uygulayan bir sınıf oluşturun. Bir Human'ın birnamealanı (String) vardır. İsmi başlatmak için bir yapıcı (constructor) ekleyin vespeak()metodunu şu değeri döndürecek şekilde uygulayın:[name] says: Hello everyone!Robot.java:Speakerarayüzünü uygulayan başka bir sınıf oluşturun. Bir Robot'un birmodelalanı (String) vardır. Modeli başlatmak için bir yapıcı ekleyin vespeak()metodunu şu değeri döndürecek şekilde uygulayın:Robot [model] says: Beep boop!Main.java: Arayüz tabanlı polimorfizm (çok biçimlilik) kullanarak her şeyi bir araya getirin. İki girdi alacaksınız: bir insan ismi ve bir robot modeli. Bir Human ve bir Robot oluşturun, ardından bunları birSpeakerreferans dizisinde saklayın. Diziyi döngüye alın ve her hoparlör içinspeak()metodunu çağırmanın sonucunu yazdırın.
İki girdi alacaksınız: insanın ismi (String) ve robotun modeli (String).
Çıktınız her hoparlör için birer tane olmak üzere iki satır göstermelidir. Tamamen farklı şekillerde konuşsalar bile, hem Human hem de Robot'un Speaker arayüzü aracılığıyla nasıl tek tip olarak ele alınabildiğine dikkat edin!
Kopya kağıdı
Bir sınıf, bir arayüzü uygulamak için implements anahtar kelimesini kullanır ve arayüzde tanımlanan tüm metotlar için somut uygulamalar sağlamalıdır:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}@Override anotasyonu isteğe bağlıdır ancak hataları yakalamaya yardımcı olduğu için önerilir.
Arayüzler referans tipleri olarak kullanılabilir; bu, aynı arayüzü uygulayan farklı sınıfların tek tip olarak ele alınabildiği polimorfizmi (çok biçimlilik) sağlar:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // 5.0 yarıçaplı bir daire çiziliyor
shape2.draw(); // 4.0 x 3.0 boyutlarında bir dikdörtgen çiziliyorKendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO: Verilen isimle bir Human nesnesi oluşturun
// TODO: Verilen modelle bir Robot nesnesi oluşturun
// TODO: Her iki nesneyi de içeren bir Speaker referans dizisi oluşturun
// TODO: Dizi boyunca döngü kurun ve her bir speaker için speak() sonucunu yazdırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı