- Modülerlik: Kod, sınıflar ve nesneler halinde düzenlenir, böylece bakım ve değiştirme daha kolay hale gelir.
- Yeniden Kullanılabilirlik: Kalıtım ve bileşim yoluyla mevcut kodu yeniden kullanabilirsiniz.
- Kapsülleme: İç durumu ve işlevselliği gizler, yalnızca gerekli olanı açığa çıkarır.
- Polimorfizm: Tek bir arayüzün farklı temel formları (metodlar veya sınıflar) kontrol etmesine izin verir.
- Soyutlama: Probleme uygun sınıfları modelleyerek karmaşık gerçeklikleri basitleştirir.
- Java
- C++
- C#
- Python (birden fazla paradigmayı destekler, OOP dahil)
- Ruby
- JavaScript (prototip tabanlı kalıtım)
- Yalnızca soyut metodlar (eski Java sürümlerinde) ve static/final alanlar içerir.
- Bir sınıf birden fazla arayüzü implemente edebilir.
- Bir sözleşme tanımlar (hangi metodların implemente edilmesi gerektiği), ancak bu metodların nasıl implemente edileceğini belirtmez (Java 8+ ile default metodlara izin verilir).
- Hem soyut hem de somut metodlar içerebilir.
- Örnek değişkenler (instance variable) ve yapıcı metotlara (constructor) sahip olabilir.
- Bir sınıf yalnızca bir soyut sınıfı extend edebilir (tek kalıtım).
- Alt sınıflar arasında ortak durum ve davranışı paylaşmak istediğinizde kullanışlıdır.
equals
: Nesneler arasındaki mantıksal eşitliği belirler. Varsayılan olarak,Object
sınıfındakiequals
, referans eşitliğini kontrol eder (yani, aynı bellek adresi). Nesne alanlarına dayalı eşitlik tanımlamak için override edilir.hashCode
:HashMap
,HashSet
gibi hash tabanlı koleksiyonlarda kullanılır. Eğer iki nesneequals
'a göre eşitse, aynıhashCode
değerine sahip olmaları gerekir.- Ne zaman override etmeli?:
- Nesneleri mantıksal olarak (örneğin, aynı "değer" veya aynı alanlar) karşılaştırmanız gerektiğinde, referans yerine.
equals
metodunu override ediyorsanız, aralarındaki sözleşmeyi korumak için her zamanhashCode
metodunu da override edin.
- Nedir?
Çoklu kalıtım durumlarında (örneğin, C++), bir sınıf ortak bir temel sınıfı paylaşan iki sınıftan kalıtım alabilir ve bu durum metodlar/alanlar için belirsizlik yaratır. Java, çoklu sınıf kalıtımından kaçındığı için bu problem tipik olarak default metodlara sahip arayüzlerde ortaya çıkar. - Nasıl çözülür?:
Java, çakışan default metodları kendi sınıfınızda açıkça override etmenizi gerektirir, kendi implementasyonunuzu sağlayarak (veya ebeveyn arayüzlerden birinin default metodunu seçerek).
- Neden Gerekir?:
- Bellek yönetimini otomatikleştirir.
- Geliştiricileri manuel bellek ayırma/silme işinden kurtarır.
- Bellek sızıntılarını ve işaretçi (pointer) sarkan nesneleri (dangling pointers) önler.
- Nasıl Çalışır?:
- JVM'nin çöp toplayıcısı, canlı referanslardan erişilemeyen nesneleri periyodik olarak tarar ve belleklerini geri kazanır.
- Farklı GC algoritmaları (örneğin, Mark-Sweep, G1 vb.) performans ve strateji bakımından farklılık gösterir.
static
alan (field): Bir sınıfın tüm örnekleri arasında paylaşılır.static
metod: Sınıfa ait olup herhangi bir örneğe bağlı değildir, nesne oluşturmadan çağrılabilir.static
blok: Bir sınıfın statik başlatılması (initialization) için kullanılır.static
iç sınıf (inner class): Dış sınıfın bir örneğine ihtiyaç duymayan iç içe geçmiş sınıf.
- Anlamı: Bir nesnenin durumu (state), oluşturulduktan sonra değiştirilemez.
- Nerede:
- Veri aktarım nesnelerinde (DTO), değer nesnelerinde (value objects) ve çok iş parçacıklı (thread-safe) tasarımlarda yaygın olarak kullanılır.
- Nasıl:
- Alanları
private final
olarak tanımlayın. - Setter metodları (veya alanları değiştiren metodlar) sağlamayın.
- Alanları yapıcı metod (constructor) içerisinde başlatın.
- Alanları
- Neden:
- Kodun anlaşılmasını kolaylaştırır, özellikle çok iş parçacıklı ortamlarda.
- Durum değişikliğine bağlı hataları azaltır.
-
Bileşim (Composition):
- İlişkinin güçlü formu: Sahiplik ile "sahip-olma" ilişkisi.
- Eğer konteyner nesnesi yok edilirse, bileşen nesneler de yok edilir.
- Örnek: Bir
Araba
'nın birMotor
u vardır (motor, araba olmadan var olamaz).
-
Toplulaştırma (Aggregation):
- İlişkinin zayıf formu: Sahiplik olmaksızın "sahip-olma" ilişkisi.
- Eğer konteyner nesnesi yok edilirse, içerilen nesne başka yerlerde var olmaya devam edebilir.
- Örnek: Bir
Takım
ınOyuncuları
vardır, ancak bir oyuncu farklı takımlarda da yer alabilir.
-
Uyum (Cohesion):
- Bir modül/sınıf içindeki öğelerin ne kadar bir araya ait olduğunu ifade eder.
- Yüksek uyum, sınıfın tek bir göreve veya birbirine yakın görevlerde odaklandığı anlamına gelir.
-
Bağlılık (Coupling):
- Modüller/sınıflar arasındaki bağımlılık derecesidir.
- Düşük bağlılık, bir sınıftaki değişikliklerin diğer sınıfları minimum derecede etkilemesi anlamına gelir.
- Yüksek uyum ve düşük bağlılık.
-
Stack (Yığın):
- Metod yürütme ve yerel değişkenler için bellek alanıdır.
- Metod çağrıları/geri dönüşleriyle büyür veya küçülür.
- Yığında saklanan değişkenlerin ömrü kısa (metod kapsamındadır).
-
Heap (Yığın Bellek):
- Nesnelerin dinamik olarak atanması (allocation) için bellek alanıdır.
- Nesneler, referans verilmediğinde (sonrasında çöp toplanır) heap'te yaşarlar.
- Daha esnektir, ancak yönetilmesi daha maliyetlidir.
- Nedir?: İstisna, bir programın normal yürütme akışını bozan bir olaydır.
- Türler:
- Checked Exceptions (Kontrol Edilen İstisnalar):
Exception
sınıfından türetilmiştir (ancakRuntimeException
hariç). Ya yakalanmalı ya da metod imzasındathrows
ile bildirilmelidir.- Örnek:
IOException
,SQLException
.
- Örnek:
- Unchecked Exceptions (Kontrol Edilmeyen İstisnalar):
RuntimeException
sınıfından türetilmiştir. Yakalanması veya bildirilmesi gerekmez.- Örnek:
NullPointerException
,ArrayIndexOutOfBoundsException
.
- Örnek:
- Error: Genellikle tipik uygulamalar tarafından ele alınmayan ciddi sorunlardır.
- Örnek:
OutOfMemoryError
.
- Örnek:
- Checked Exceptions (Kontrol Edilen İstisnalar):
- Temiz Kod: Okunabilir, sürdürülebilir ve verimli olan, tutarlı kurallara, basit tasarıma ve anlamlı isimlendirmeye sahip, gereksiz tekrarların olmadığı koddur.
- Metod Gizleme, alt sınıfta bulunan bir static metodun, üst sınıfta bulunan static metodla aynı imzaya (signature) sahip olması durumunda meydana gelir.
- Bu, instance metodlarda geçerli olan override ile aynı şey değildir. Bunun yerine, alt sınıfın static metodu, üst sınıfın static metodunu gizler.
-
Soyutlama (Abstraction):
- Bir sınıfın veya metodun ne yaptığına odaklanır, nasıl yaptığına değil.
- Soyut sınıflar ve arayüzler aracılığıyla gerçekleştirilir.
- Uygulama detaylarını gizleyerek karmaşıklığı azaltır.
-
Polimorfizm (Polymorphism):
- Nesnelerin, üst tipleri (veya arayüzleri) şeklinde temsil edilmesine ve gerçek (çalışma zamanındaki) tiplere bağlı olarak farklı davranmasına olanak tanır.
- Başlıca metod override (üstüne yazma) (dinamik bağlama) yoluyla gerçekleştirilir.
- Farklı implementasyonların yer değiştirmesine izin vererek kodda esneklik sağlar.