Menu
Coddy logo textTech

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);  // true

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

challenge icon

Görev

Kolay

Farklı 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 bir model alanı (String) vardır. Bunu başlatmak için bir kurucu, getModel() getter metodunu ve şu çıktıyı yazdıran bir inspect() metodu ekle: Inspecting vehicle: [model]
  • Car.java: Vehicle sınıfını genişleten bir sınıf oluştur. Arabaların ek olarak bir numDoors alanı (int) vardır. Üst sınıfın başlatılması için super kullan. [model] has [numDoors] doors çıktısını yazdıran bir checkDoors() metodu ekle.
  • Motorcycle.java: Vehicle sınıfını genişleten başka bir sınıf oluştur. Motosikletlerin bir hasSidecar alanı (boolean) vardır. Boolean değerine bağlı olarak [model] has a sidecar veya [model] has no sidecar çıktılarından birini yazdıran bir checkSidecar() metodu ekle.
  • Main.java: instanceof burada 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 Vehicle referansları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 instanceof kullan; öyleyse güvenli bir şekilde alt türe dönüştür ve checkDoors() metodunu çağır
    • Motorcycle olup olmadığını kontrol etmek için instanceof kullan; öyleyse güvenli bir şekilde alt türe dönüştür ve checkSidecar() metodunu çağır

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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi