instanceof Operatörü
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 31 / 87.
Önceki derste, nesne gerçekten dönüştürmeye çalıştığınız tür değilse aşağı doğru tür dönüşümünün ClassCastException ile başarısız olabileceğini gördünüz. instanceof operatörü, tür dönüşümünden önce bir nesnenin türünü kontrol etmenizi sağlayarak bu sorunu çözer.
Sözdizimi basittir: object instanceof ClassName, nesne o sınıfın (veya alt sınıflarından herhangi birinin) bir örneğiyse true döndürür:
Animal animal = new Dog();
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark(); // Dog'a özgü metotları çağırmak güvenli
}Bu kontrol, dönüşümün başarılı olmasını sağlayarak çalışma zamanı hatalarını önler. Operatör, hiyerarşideki üst türler için de true döndürür:
Dog dog = new Dog();
System.out.println(dog instanceof Dog); // true
System.out.println(dog instanceof Animal); // true
System.out.println(dog instanceof Object); // trueJava 16'dan beri, desen eşleştirme kullanarak denetleme ve tür dönüşümünü tek adımda birleştirebilirsiniz:
if (animal instanceof Dog dog) {
dog.bark(); // 'dog' zaten cast edilmiş ve kullanıma hazır
}Bu daha temiz söz dizimi, ayrı cast satırını ortadan kaldırır. instanceof ifadesinin null ile test edildiğinde false döndürdüğünü unutma; bu nedenle ayrı bir null denetimine ihtiyacın yoktur.
Görev
KolayFarklı araç türlerini güvenli bir şekilde tanımlayıp ele almak için instanceof operatörünü kullanan bir araç denetim sistemi oluşturalım. Bir araç hiyerarşisi oluşturacak ve özel özelliklerine erişmeden önce her aracın gerçek türünü kontrol eden kod yazacaksın.
Kodunu dört dosya arasında düzenleyeceksin:
Vehicle.java: Tüm araçların ortak kullandığı temel sınıfı oluştur. Her aracın birmodelalanı (String) vardır. Bunu başlatmak için bir kurucu,getModel()getter metodunu ve şu çıktıyı yazdıran birinspect()metodu ekle:Inspecting vehicle: [model]Car.java: Vehicle sınıfını genişleten bir sınıf oluştur. Arabaların ek olarak birnumDoorsalanı (int) vardır. Üst sınıfın başlatılması içinsuperkullan.[model] has [numDoors] doorsçıktısını yazdıran bircheckDoors()metodu ekle.Motorcycle.java: Vehicle sınıfını genişleten başka bir sınıf oluştur. Motosikletlerin birhasSidecaralanı (boolean) vardır. Boolean değerine bağlı olarak[model] has a sidecarveya[model] has no sidecarçıktılarından birini yazdıran bircheckSidecar()metodu ekle.Main.java:instanceofburada kritik hâle gelir! Dört girdi alacaksın: bir araba modeli, kapı sayısı, bir motosiklet modeli ve motosiklette yan sepet olup olmadığı (true/false).Bir Car ve bir Motorcycle içeren
Vehiclereferanslarından oluşan bir dizi oluştur. Ardından dizide döngüye gir ve her araç için:- Temel
inspect()metodunu çağır - Car olup olmadığını kontrol etmek için
instanceofkullan; öyleyse güvenli bir şekilde alt türe dönüştür vecheckDoors()metodunu çağır - Motorcycle olup olmadığını kontrol etmek için
instanceofkullan; öyleyse güvenli bir şekilde alt türe dönüştür vecheckSidecar()metodunu çağır
- Temel
Dört girdi alacaksın: araba modeli (String), kapı sayısı (int), motosiklet modeli (String) ve yan sepet olup olmadığı (boolean).
Çıktın dört satır göstermelidir; her araç için denetim mesajını ve ardından türe özgü kontrolü göreceksin. instanceof operatörü, Car metotlarını yalnızca gerçek Car nesnelerinde ve Motorcycle metotlarını yalnızca gerçek Motorcycle nesnelerinde çağırmanı sağlayarak herhangi bir ClassCastException oluşmasını önler!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String carModel = scanner.nextLine();
int numDoors = Integer.parseInt(scanner.nextLine());
String motorcycleModel = scanner.nextLine();
boolean hasSidecar = Boolean.parseBoolean(scanner.nextLine());
// TODO: carModel ve numDoors ile bir Car nesnesi oluştur
// TODO: motorcycleModel ve hasSidecar ile bir Motorcycle nesnesi oluştur
// TODO: Car ve Motorcycle içeren Vehicle referanslarından bir dizi oluştur
// TODO: Diziyi döngüyle gez ve her vehicle için:
// 1. inspect() metodunu çağır
// 2. Bir Car olup olmadığını kontrol etmek için instanceof kullan, sonra downcast yap ve checkDoors() çağır
// 3. Bir Motorcycle olup olmadığını kontrol etmek için instanceof kullan, sonra downcast yap ve checkSidecar() çağı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