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 ders, nesne aslında dönüştürmeye çalıştığınız türde değilse aşağı doğru tür dönüştürmenin (downcasting) bir ClassCastException ile başarısız olabileceğini gösterdi. instanceof operatörü, dönüştürme yapmadan önce bir nesnenin türünü kontrol etmenize izin vererek 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ği ise 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üvenlidir
}

Bu kontrol, tür dönüşümünün başarılı olmasını sağlayarak çalışma zamanı hatalarını önler. Operatör ayrıca hiyerarşideki üst türler için de true değerini 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 (pattern matching) kullanarak kontrol ve tür dönüşümü işlemlerini tek bir adımda birleştirebilirsiniz:

if (animal instanceof Dog dog) {
    dog.bark();  // 'dog' zaten dönüştürülmüştür ve kullanıma hazırdır
}

Bu daha temiz sözdizimi, ayrı bir tür dönüştürme (cast) satırını ortadan kaldırır. instanceof operatörünün null ile test edildiğinde false döndürdüğünü unutmayın; bu nedenle ayrı bir null kontrolüne ihtiyacınız yoktur.

challenge icon

Görev

Kolay

Farklı araç türlerini güvenli bir şekilde tanımlamak ve işlemek için instanceof operatörünü kullanan bir araç muayene sistemi oluşturalım. Bir araç hiyerarşisi oluşturacak ve her aracın özel özelliklerine erişmeden önce gerçek türünü kontrol eden bir kod yazacaksınız.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • Vehicle.java: Tüm araçların paylaştığı temel sınıfı oluşturun. Her aracın bir model alanı (String) vardır. Bunu başlatmak için bir yapıcı (constructor), bir getter metodu getModel() ve şu çıktıyı veren bir inspect() metodu ekleyin: "Inspecting vehicle: " + model
  • Car.java: Vehicle sınıfını genişleten bir sınıf oluşturun. Arabaların ek bir numDoors alanı (int) vardır. Üst sınıf başlatması için super kullanın. Şu çıktıyı veren bir checkDoors() metodu ekleyin: getModel() + " has " + numDoors + " doors"
  • Motorcycle.java: Vehicle sınıfını genişleten başka bir sınıf oluşturun. Motosikletlerin bir hasSidecar alanı (boolean) vardır. Boolean değerine bağlı olarak getModel() + " has a sidecar" veya getModel() + " has no sidecar" yazdıran bir checkSidecar() metodu ekleyin.
  • Main.java: İşte instanceof operatörünün vazgeçilmez olduğu yer burası! Dört girdi alacaksınız: bir araba modeli, kapı sayısı, bir motosiklet modeli ve bir sepeti (sidecar) olup olmadığı (true/false).

    Bir Car ve bir Motorcycle içeren bir Vehicle referans dizisi oluşturun. Ardından dizi boyunca döngü kurun ve her araç için:

    • Temel inspect() metodunu çağırın
    • Bir Car olup olmadığını kontrol etmek için instanceof kullanın - eğer öyleyse, güvenli bir şekilde alt türe dönüştürün (downcast) ve checkDoors() metodunu çağırın
    • Bir Motorcycle olup olmadığını kontrol etmek için instanceof kullanın - eğer öyleyse, güvenli bir şekilde alt türe dönüştürün (downcast) ve checkSidecar() metodunu çağırın

Dört girdi alacaksınız: araba modeli (String), kapı sayısı (int), motosiklet modeli (String) ve sepeti olup olmadığı (boolean).

Çıktınız dört satır göstermelidir - her araç için muayene mesajını ve ardından türe özgü kontrolünü göreceksiniz. instanceof operatörü, Car metodlarını yalnızca gerçek Car nesnelerinde ve Motorcycle metodlarını yalnızca gerçek Motorcycle nesnelerinde çağırmanızı sağlayarak herhangi bir ClassCastException hatasını önler!

Kopya kağıdı

instanceof operatörü, bir nesnenin tür dönüşümü (casting) yapılmadan önce belirli bir sınıfın örneği olup olmadığını kontrol eder:

Animal animal = new Dog();

if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.bark();  // Dog sınıfına özgü metotları çağırmak güvenlidir
}

Operatör, nesnenin kendi sınıfı ve hiyerarşideki tüm üst sınıfları için true değerini 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 (pattern matching) kontrol ve tür dönüşümü işlemlerini tek bir adımda birleştirir:

if (animal instanceof Dog dog) {
    dog.bark();  // 'dog' değişkeni zaten dönüştürülmüştür ve kullanıma hazırdır
}

instanceof operatörü, null değerine karşı test edildiğinde false döndürür, bu da ayrı null kontrolleri yapma ihtiyacını ortadan kaldırır.

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şturun
        
        // TODO: motorcycleModel ve hasSidecar ile bir Motorcycle nesnesi oluşturun
        
        // TODO: Car ve Motorcycle içeren bir Vehicle referans dizisi oluşturun
        
        // TODO: Dizi boyunca döngü kurun ve her araç için:
        // 1. inspect() metodunu çağırın
        // 2. Bir Car olup olmadığını kontrol etmek için instanceof kullanın, ardından downcast yapın ve checkDoors() metodunu çağırın
        // 3. Bir Motorcycle olup olmadığını kontrol etmek için instanceof kullanın, ardından downcast yapın ve checkSidecar() metodunu çağırın
    }
}
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