Dinamik bağlama
- Java kursu
- Orta seviye
- Ders 60/116
- 5 dk
Ç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
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
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
for (Shape s : ____) {
System.out.println(s.area());
}
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 |