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, implements anahtar sözcüğünü kullanarak onu uygulamalıdır. Sınıf daha sonra arayüzde bildirilen tüm yöntemler 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);
}
}Bir sınıf bir interface uyguluyor ancak tüm method’ları için uygulama sağlamıyorsa derleyici bir hata verir. @Override açıklaması 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ü başvuru türü olarak kullanabilirsiniz. Bu, aynı arayüzü uygulayan farklı sınıfların tekdüze bir şekilde 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(); // Yarıçapı 5.0 olan 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. Yalnızca nesnenin çizilebilmesini önemser.
Bir sonraki derste, tek bir sınıfın aynı anda birden fazla arayüzü nasıl uygulayabildiğini göreceksin.
Görev
KolayArayüzlerin sınıflar tarafından nasıl uygulandığı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ü geliştireceksin.
Kodunu dört dosyaya ayıracaksın:
Speaker.java: Herhangi bir hoparlörün yapabilmesi gerekenleri bildirenSpeakeradlı bir arayüz tanımla. Her hoparlörün bir String döndürenspeak()metoduna sahip olması gerekir. Bu, uygulayan tüm sınıfların yerine getirmesi gereken sözleşmedir.Human.java:Speakerarayüzünü uygulayan bir sınıf oluştur. Bir Human nesnesinin birnamealanı (String) vardır. name değerini başlatmak için bir kurucu ekle vespeak()metodunu şu değeri döndürecek şekilde uygula:[name] says: Hello everyone!Robot.java:Speakerarayüzünü uygulayan başka bir sınıf oluştur. Bir Robot nesnesinin birmodelalanı (String) vardır. model değerini başlatmak için bir kurucu ekle vespeak()metodunu şu değeri döndürecek şekilde uygula:Robot [model] says: Beep boop!Main.java: Arayüz tabanlı çok biçimlilik kullanarak her şeyi bir araya getir. İki girdi alacaksın: bir insan adı ve bir robot modeli. Bir Human ve bir Robot oluştur, ardından bunlarıSpeakerreferanslarından oluşan bir dizide sakla. Dizi üzerinde döngü kur ve her hoparlör içinspeak()çağrısının sonucunu yazdır.
İki girdi alacaksın: insanın adı (String) ve robotun modeli (String).
Çıktın iki satır göstermelidir: her hoparlör için bir satır. Tamamen farklı şekillerde konuşmalarına rağmen hem Human hem de Robot nesnelerinin Speaker arayüzü üzerinden nasıl aynı şekilde ele alınabildiğine dikkat et!
Kendin 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ştur
// TODO: Verilen modelle bir Robot nesnesi oluştur
// TODO: Her iki nesneyi içeren Speaker referanslarından bir dizi oluştur
// TODO: Diziyi döngüye al ve her speaker için speak() sonucunu yazdır
}
}
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ıKendi başına pratik yap: Online Java derleyicisi