Menu

Java Kalıtım: extends, super ve Override Etme

Bir Java alt sınıfının extends ile alanları ve metotları nasıl miras aldığı, super ile üst sınıfı nasıl çağırdığı ve davranışı nasıl override ettiği - ve sık yapılan hatalar.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Kalıtım, "-dır" Türünde Yeniden Kullanımdır

Kalıtım, yeni bir sınıfın mevcut bir sınıfın üzerine inşa edilmesini sağlar. Yeni sınıf -yani alt sınıf- üst sınıfın alanlarını ve metotlarını otomatik olarak alır, ardından ihtiyaç duyduğu şeyi ekler ya da değiştirir. Bir tür başka bir türün daha özel bir biçimi olduğunda buna başvurursunuz: bir Dog, bir Animal'dır; bir SavingsAccount, bir BankAccount'tır.

Bunu extends anahtar kelimesiyle yazarsınız. Üst sınıftaki public veya protected olan her şey, yeniden yazmaya gerek kalmadan alt sınıfta kullanılabilir.

Dog, name veya eat()'i hiç tanımlamaz, ama yine de her ikisine de sahiptir. İşin bütün amacı budur: paylaşılan davranış tek bir yerde yaşar.

super: Üst Sınıfa Ulaşmak

Bir alt sınıf yapıcısı, önce üst sınıfın kurulduğundan emin olmalıdır. Bunu super(...) ile yaparsınız; bu, üst sınıfın yapıcısını çağırır ve alt sınıf yapıcısındaki ilk ifade olmak zorundadır. Bunu atlarsanız Java, üst sınıfın argümansız yapıcısına sessizce bir çağrı ekler - ve üst sınıfın böyle bir yapıcısı yoksa kod derlenmez.

Çıktı, üst sınıfın yapıcısının alt sınıfın gövdesinden önce çalıştığını gösterir - inşa, hiyerarşinin tepesinden aşağıya doğru akar.

Metotları Override Etmek

Bir alt sınıf, miras alınan bir metodu aynı imzayla yeniden tanımlayarak değiştirebilir. Buna override etme denir ve bunu her zaman @Override ile işaretlemelisiniz. Anotasyon zorunlu değildir, ancak gerçekten bir üst sınıf metoduyla eşleştiğinizi derleyicinin doğrulamasını sağlar - toString() yerine tostring() gibi, aksi takdirde sessizce yepyeni bir metot oluşturacak yazım hatalarını yakalar.

Dizi Animal türünde olsa da, her eleman kendi speak()'ini çalıştırır. Java metodu, değişkenin bildirilen türüne göre değil, çalışma zamanındaki gerçek nesneye göre seçer - işte polimorfizmin temeli budur.

super.method() ile Üst Sınıfın Sürümünü Çağırmak

Override etmek, üst sınıfın işini tamamen çöpe atmak zorunda değildir. Miras alınan sürümü çalıştırıp ardından üzerine eklemek için super.method() kullanın:

super. olmadan, TimestampLogger.log içinde log'u çağırmak kendisini çağırır ve sonsuza kadar özyinelemeye girer. super. açıkça "üst sınıfın sürümü" anlamına gelir.

Miras Alınan Alanlar ve Erişim

Bir alt sınıf, üst sınıfın public ve protected üyelerini görür ama private olanları görmez. private alanlar nesnede hâlâ vardır - üst sınıfın kendi metotları onlara erişebilir - ancak alt sınıf onlara doğrudan referans veremez. Bir üyeyi ilgisiz koddan gizli tutarken alt sınıfların erişebilmesini istediğinizde protected kullanın.

class Base {
    private int secret;      // alt sınıflara görünmez
    protected int shared;    // alt sınıflara görünür
}

class Derived extends Base {
    void demo() {
        shared = 5;          // OK
        // secret = 5;       // derleme hatası - Base'e özel (private)
    }
}

Bir alt sınıf yapıcısının çoğu zaman super(...)'ı çağırmak zorunda olmasının bir nedeni de budur: üst sınıfın private durumunu başlatmanın tek yolu budur.

final ile Kalıtımı Durdurmak

Bazen bir sınıfın hiç extends edilmemesi gerekir - String'in tam olarak bu nedenle final olması gibi. Bir sınıfı final olarak işaretlemek alt sınıf oluşturmayı yasaklar; bir metodu final olarak işaretlemek ise sınıfın extends edilmesine yine de izin verirken o metodun override edilmesini yasaklar.

final class Constants { }            // alt sınıfı oluşturulamaz

class Config {
    final void load() { }            // alt sınıflar Config'i extends edebilir
                                     // ama load()'u override edemez
}

Bir sınıfın davranışının program genelinde garanti altında ve değişmez olması gerektiğinde final'a başvurun - bu, varsayılan seçenek değil, kasıtlı bir "extends etme" sinyalidir.

Sık Yapılan Bir Hata: "-dır" Değilse Kompozisyonu Tercih Edin

Kalıtım, kodu yeniden kullandığı için cazip gelir, ancak çocuğu ebeveyne sıkı sıkıya bağlar. İlişki gerçek bir "-dır" değilse -diyelim ki bir Engine'e ihtiyaç duyan bir Car- Car extends Engine yapmayın. Bir araba bir motora sahiptir, bir motor değildir. Bunu bunun yerine bir alanla (kompozisyon) modelleyin:

class Car {
    private Engine engine = new Engine();   // Car bir Engine'e SAHİPTİR

    void start() { engine.ignite(); }
}

Kalıtımı yalnızca alt sınıf gerçekten üst sınıfın özelleşmiş bir biçimiyse ve onun davranışını miras alıp aynı zamanda yerine geçirmek istiyorsanız kullanın.

Sıradaki: Arayüzler

extends ile kalıtım size tek bir üst sınıf ve paylaşılan bir uygulama verir. Ancak bir sınıf yalnızca bir sınıfı extends edebilir - peki ilgisiz sınıflara ortak bir yeteneği nasıl kazandırırsınız? İşte arayüzler bunun içindir: birçok sınıfın uygulayabileceği bir sözleşme ve bir sonraki sayfanın konusu.

Sıkça Sorulan Sorular

Java'da kalıtım nedir?

Kalıtım, bir sınıfın (alt sınıf) başka bir sınıfın (üst sınıf) alanlarını ve metotlarını extends anahtar kelimesiyle yeniden kullanmasını sağlar. Alt sınıf, üst sınıfın public ve protected üyelerini otomatik olarak alır ve yenilerini ekleyebilir ya da miras alınan davranışı override ederek değiştirebilir. Bir "-dır" ilişkisini modeller: bir Dog, bir Animal'dır.

Java'da super anahtar kelimesi ne işe yarar?

super, üst sınıfı ifade eder. Bir yapıcıdaki super(...), üst sınıfın yapıcısını çağırır (ve ilk ifade olmak zorundadır); super.method() ise override ettiğiniz bir metodun üst sınıftaki sürümünü çağırır. Bu, bir alt sınıfın üst sınıfın mantığını tamamen değiştirmek yerine onun üzerine inşa etmesini sağlar.

Java'da override ile overload arasındaki fark nedir?

Override etme, miras alınan bir metodu alt sınıfta aynı imzayla yeniden tanımlayarak davranışını değiştirir - bunu @Override ile işaretleyin. Overload etme ise aynı sınıfta aynı ada sahip ancak farklı parametre listelerine sahip birden fazla metot tanımlar. Override etme kalıtım ve çalışma zamanında dağıtımla ilgilidir; overload etme ise yalnızca aynı adı paylaşan iki metottur.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA