CodeBlanks Logo Icon CodeBlanks

Dinamik bağlama

Çalışma zamanında hangi metodun çağrıldığını öğrenirsin.

Dinamik bağlama nasıl çalışır?

Dinamik bağlama, metodun derleme zamanında değil çalışma zamanında seçilmesidir. Derleyici yalnızca referans türünün metodu bildirdiğini denetler; hangi kodun çalışacağına JVM karar verir.

Bir listede farklı türleri üst sınıf olarak topladığında her eleman kendi area metodunu çağırır. for (Shape s : shapes) s.area() döngüsü her tür için doğru sonucu üretir; bu, polimorfizmin gücüdür.

Override koşulları

Alt sınıftaki metodun üst sınıftaki metodu geçersiz kılabilmesi için imzası birebir eşit olmalı: aynı ad, aynı parametre listesi, uyumlu dönüş türü. @Override annotation'ı kullanmak zorunlu değildir ama derleme hatasını erken yakalar.

Erişim seviyesi daraltılamaz; üst sınıf protected ise alt sınıf public olabilir ama private olamaz. Metot final ise override edilemez.

Uygulama Shape listesinde dinamik bağlama

Üstteki Shape ve Square tanımlarına bir de class Triangle extends Shape ekle: int base, int height, yapıcı ve area metodu return base * height / 2; ile. Sonra main içinde List<Shape> shapes = new ArrayList<>(); oluştur, içine new Square(4) ve new Triangle(6, 4) ekle, for-each ile her birinin area sonucunu ayrı satırda yazdır.

Başlangıç kodu

Main.java
import java.util.List;
import java.util.ArrayList;

// Shape ve Square yukarıdaki gibi

// Triangle sınıfını ekle: base, height, area = base * height / 2

// main: shapes listesini doldur ve for-each ile area yazdır

Örnek çözüm

Main.java
class Shape {
    int area() { return 0; }
}

class Square extends Shape {
    int side;
    Square(int side) { this.side = side; }
    int area() { return side * side; }
}

class Triangle extends Shape {
    int base;
    int height;
    Triangle(int b, int h) { this.base = b; this.height = h; }
    int area() { return base * height / 2; }
}

public class Main {
    public static void main(String[] args) {
        List<Shape> shapes = new ArrayList<>();
        shapes.add(new Square(4));
        shapes.add(new Triangle(6, 4));
        for (Shape s : shapes) {
            System.out.println(s.area());
        }
    }
}

Beklenen çıktı

16
12

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Döngü başlığını tamamla

Soru
for (Shape s : ____) {
    System.out.println(s.area());
}
Cevap
for (Shape s : shapes) {
    System.out.println(s.area());
}

Açıklama: for-each döngüsü shapes listesindeki her Shape için döner.

2 Aşağıdakilerden hangisi override koşuludur?

  • Dönüş türü rastgele seçilebilir
  • İmza (ad ve parametreler) birebir eşit olmalı Doğru cevap
  • Erişim seviyesi daraltılabilir
  • Final metotlar override edilebilir

Açıklama: Override için imza birebir eşit olmalıdır.

3 Override koşullarını eşleştir

Kavram Anlamı
@Override Derleme zamanı denetim annotation'ı
final Override'i engeller
protected Alt sınıfta public olabilir
private Override dışında kalır

Orta seviye bölümündeki tüm dersler