Menu

Java Soyut Sınıflar: abstract Anahtar Kelimesi Açıklaması

Java soyut sınıfının ne olduğu, soyut metotların nasıl tanımlandığı, neden örneklenemediği ve ne zaman arayüz yerine soyut sınıf seçmeniz gerektiği.

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

Soyut Sınıf Nedir

Bir arayüz, durum içermeyen davranış tanımlar. Sıradan bir sınıf ise tamamen uygulanmıştır ve örneklenebilir. Soyut sınıf ikisinin arasında durur: normal bir sınıf gibi alanlar, yapıcılar ve tamamlanmış metotlar taşıyabilir, ama bazı metotları uygulanmamış olarak bırakabilir ve doğrudan örneklenmeyi yasaklar. Onu abstract anahtar kelimesiyle işaretlersiniz.

Buradaki fikir, alt sınıfların ortak olan her şeyini tek bir yerde toplamak ve aynı zamanda her alt sınıfı gerçekten farklılaşan kısımları doldurmaya zorlamaktır.

Animal, getName() metodunu tüm alt sınıflar için bir kez tanımlar ve sound() metodunu abstract olarak bildirir; bu, imzası olan ama gövdesi olmayan ve Dog tarafından sağlanması gereken bir metottur.

Soyut Bir Sınıfı Örnekleyemezsiniz

Soyut bir sınıfın tamamlanmamış metotları olabileceğinden, onu doğrudan oluşturmak elinizde eksik bir nesne bırakır. Derleyici bunu reddeder:

Animal a = new Animal("???");   // error: Animal is abstract; cannot be instantiated

Her zaman somut bir alt sınıfı, yani tüm soyut metotları uygulamış olanı örneklersiniz. Bu alt sınıf örneği daha sonra soyut tipteki bir değişkende tutulabilir; soyutlamayı tam olarak böyle kullanırsınız.

Soyut Metotlar Alt Sınıfları Karar Vermeye Zorlar

Bir abstract metot, alt sınıfın tutması gereken bir sözdür. Bir alt sınıf bunlardan birini uygulamayı unutursa, alt sınıfın kendisi soyut hale gelir ve derleyici bunu size söyler. Soyut sınıfın temel kaldıracı budur: belirli bir davranışın var olduğunu garanti eder ama o davranışın ne yaptığını dikte etmez.

describe(), Shape içinde yalnızca bir kez yazılır ama yine de her alt sınıfın kendi area() metodunu çağırır. Soyut sınıf ortak iskeleti sağlar; alt sınıflar ayrıntıları sağlar.

Paylaşılan Durum ve Yapıcılar

Geleneksel bir arayüzden farklı olarak, soyut bir sınıf örnek alanları tutabilir ve yapıcılar tanımlayabilir. Yapıcı tek başına asla bir Animal ya da Shape oluşturmaz; bir alt sınıf oluşturulduğunda super(...) aracılığıyla çalışır ve paylaşılan durumu ilklendirir.

balance alanı, deposit ve applyInterest tek bir yerde yaşar. Yalnızca gerçekten değişen politika - interestRate() - soyut bırakılır. Bir alt sınıfın yapıcısı, bu miras alınan durumu ilklendirmek için super(...) çağırmalıdır.

Bir Tuzak: abstract ve final'i Birlikte Kullanmak

abstract ve final birbirinin zıttıdır. Bir abstract metot, üzerine yazılmasını (override) talep eder; bir final metot ise bunu yasaklar. Aynı şeyi her iki şekilde de işaretlemek - ya da bir soyut sınıfı final yapmak - bir derleme hatasıdır. Ayrıca unutmayın ki bir soyut sınıfın sıfır soyut metodu olabilir: bir sınıfı yalnızca örneklenmesini engellemek için abstract olarak bildirmek geçerlidir ve yalnızca genişletmek istediğiniz temel tipler için bazen yararlıdır.

abstract final class Bad { }        // error: abstract and final conflict

abstract class Base {
    abstract final void f();        // error: an abstract method can't be final
}

Soyut Sınıf ile Arayüz Karşılaştırması

İkisi örtüşür, bu yüzden seçim neyi paylaşmanız gerektiğine bağlıdır:

  • Soyut sınıf - durum ve kod paylaşan yakından ilişkili sınıflar için kullanın. Hem Savings hem de Checking, Account sınıfını genişletir ve balance alanı ile deposit mantığını miras alır. Bir sınıf yalnızca birini genişletir.
  • Arayüz - ilişkisiz sınıfların paylaşabileceği bir yetenek için kullanın. Bir Bird ve bir Airplane, hiçbir uygulamayı paylaşmadan ikisi de Flyable olabilir. Bir sınıf birçok arayüzü uygulayabilir.

Sık görülen bir desen ikisini birleştirir: bir arayüz sözleşmeyi tanımlar ve bir soyut sınıf tekrar eden kodu (boilerplate) uygular; böylece somut alt sınıflar yalnızca kendine özgü olanı doldurur.

Sırada: Çok Biçimlilik

Yukarıdaki her örnekte bir alt sınıf örneğini soyut tipteki bir değişkende tuttuğumuza, sonra bir metot çağırdığımızda alt sınıfın davranışını otomatik olarak aldığımıza dikkat edin. Bu tek yetenek - tek bir referans tipi, çalışma zamanında birçok davranış - çok biçimliliktir (polymorphism) ve soyut sınıflar ile arayüzleri değerli kılan şey budur. Bir sonraki sayfanın konusu da budur.

Sıkça Sorulan Sorular

Java'da soyut sınıf nedir?

Soyut sınıf, abstract anahtar kelimesiyle tanımlanan ve tek başına örneklenemeyen bir sınıftır. Genişletilmek (extend edilmek) için tasarlanmıştır. Tamamen uygulanmış metotları ve alanları (alt sınıflar için paylaşılan durum ve kod) gövdesi olmayan abstract metotlarla bir arada bulundurabilir; bu soyut metotların uygulanması her alt sınıfın sorumluluğundadır.

Java'da bir soyut sınıf örneklenebilir mi?

Hayır. new AbstractType() bir derleme hatasıdır; çünkü soyut bir sınıfın uygulanmamış (abstract) metotları olabilir ve bu durumda nesne eksik kalır. Tüm soyut metotları dolduran somut bir alt sınıfı örnekler, sonra onu soyut tipteki bir değişkende saklarsınız.

Java'da soyut sınıf ile arayüz arasındaki fark nedir?

Soyut sınıfın örnek alanları, yapıcıları ve kısmen uygulanmış mantığı olabilir, ancak bir sınıf yalnızca bir soyut sınıfı genişletebilir. Arayüz ise örnek durumu olmadan davranış tanımlar ve bir sınıf birçok arayüzü uygulayabilir. Yakından ilişkili alt sınıflar arasında durum ve kod paylaşmak için soyut sınıfı; ilişkisiz sınıflara ortak bir yetenek kazandırmak için arayüzü kullanın.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA