OOP Nedir ?
OOP(Object Oriented Programing) Türkçesi nesne yönelimli programlama demektir. Veri ve metotlardan oluşan nesnelerimizin programlanmasıdır. OOP’nin amacı programların esnekliğini, yeniden kullanılabilirliğini ve sürdürülebilirliğini sağlamaktadır. Yazdığımız kodu parçalara(sınıf) bölerek yeniden kullanılabilirliği sağlarız bunun yanında herhangi bir hata çıktığında yazılımın tamamına değil de yazılan sınıf üzerinde hatayı ararız. Bir diğer güzel yanı istediğimiz gibi yeni sınıfları tak-çıkar yapabiliriz.
Java OOP Kavramları
- Encapsulation (Kapsülleme)
- Abstraction (Soyutlama)
- Polymorphism (Çok Biçimlilik)
- Inheritance (Kalıtım)
- Class (Sınıflar)
- Object (Nesneler)

Class (Sınıflar)
Sınıflar veri ve metotları tanımladığımız birer şablonlar gibi düşünebiliriz. Tek başlarına bir önemi olmayan ancak birer object(instance) ürettiğimiz hedeflediğini yapabilen yapılardır. Örnek vermek gerekirse araba adında bir sınıfımız olsun. Rengi, motor hacmi, modeli gibi veriler sınıfın özelliğidir. Arabanın gitmesi, durması, hızlanması gibi eylemlerde sınıfın metodu olmaktadır. Bu iki yapının bir araya gelmesiyle sınıf oluşur.

Object (Nesneler)
Şablon olarak belirttiğimiz sınıflardan oluşturulan nesnelere denir. Örnek olarak araba bir sınıftır ancak BMW, Mercedes, Skoda bir nesnedir. Nesneler sınıfta belirtilen veri ve metotlarında kendine göre şekillenmiş halidir.

Inheritance (Kalıtım)
Bir sınıfın başka bir sınıftan özelliklerini miras olarak almasıdır. Örnek olarak Araba sınıfımız olsun. Her arabada ortak olan modeli, motor hacmi, rengi gibi özellikleri ve çalış(), dur() gibi metotları araba sınıfından türemiş sınıfların miras almasıdır yani onları kullanabilmesidir.
public static void main(String[] args) {
Mercedes mercedes = new Mercedes();
mercedes.renk = "Mavi";
mercedes.modelYear = 2021; // Mercedes sınıfı boş olmasına rağmen üst sınıfın
mercedes.motorHacmi = "1459 cc"; // özelliklerini ve metodunu kullanabildi.
mercedes.hizlan();
}
public class Araba {
public String renk;
public int modelYear;
public String motorHacmi;
public void hizlan(){
System.out.println("Araba Hızlandı.");
}
}
public class Mercedes extends Araba {
// Mercedes sınıfının içerisi boş.
}
Encapsulation (Kapsülleme)
Verilerin, sınıfların veya metotların hangilerine erişileceğini, değiştirilebileceğini veya hangilerinin gizleneceğini belirtilmesine denir. Access modifier(Erişim dönüştürücü) ile sağlanmaktadır. Bunlar;
- Public: Herkesin kullanabildiği özellik ve davranışlara verilen isimdir.
- Private: Sadece kendi sınıfında kullanılan özellik ve davranışlara verilen isimdir.
- Protected: Sınıf ve Miras Alınan alt sınıflarda kullanılmaya açık olanlara verilen isimdir.
- Default(Erişim belirleyici olmayan, friendly): Default tipindeki değişkenler sınıf içerisinden erişime, nesneden erişime, paket içinden erişime açıktırlar ancak protected a aksi olarak bu tür değişkenler dış paketlerden kalıtım ile dahi olsa ulaşıma açık değildirler.

Abstraction (Soyutlama)
Bir sistemin detaylarına odaklanmak yerine girdi ve çıktılarını bakmak sistemi daha iyi anlamamıza olanak sağlar. Java dilinde soyutlama abstract class (soyut sınıflar) ve interface (arayüzler) aracılığıyla yapılır. Örnek vermek gerekirse alt sınıfların ortak özelliklerini ve metotlarını taşıyan ancak bir nesnesi olmayan base bir sınıf yazmak istersek soyut bir sınıf yazabiliriz. Bu class içerisinde istersek metodun body sini yazabiliriz istersek sadece tanımı yaparak interface gibi kalıtım esnasında override edilmesini sağlayabiliriz. Bu sınıflardan nesne oluşturulamaz bundan dolayı miras alınarak yararlanılabilir. İnterface ile karıştırılmaması için farklarından bahsedelim. İster metodu istersek sınıfı erişim belirleyiciden sonra “abstract” yazarak soyutlayabiliriz.

public abstract class Machine {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public abstract void start(); // Machine sınıfından üretilen alt sınıfta
public abstract void doStaff(); // override edilip body nin o sınıfa özgü
public abstract void shutdown(); // olarak tanımlanması gerektiğini belirtir.
public void run(){ // Bu metoda ise override edilmeden
start(); // alt sınıftan kullanılabilir.
doStaff();
shutdown();
}
}
Polymorphism (Çok Biçimlilik)
Bir nesnenin birden fazla farklı şekillerde davranmasına denir. Örnek olarak araba sınıfı içerisindeki hızlan metodu Bmw arabada farklı Mercedes’de farklı çalışacaktır. Biz bu hızlan metodunu her iki sınıf içerisinde farklı davrandırtarak çok biçimliliği sağlamış oluruz.
Super anahtar kelimesi(keyword) hakkında konuşmadan olmaz. Super anahtar kelimesi ile bir üst sınıfın metodunu veya özelliğini kullanabiliriz.
public static void main(String[] args) {
calistir(new Bmw());
calistir(new Mercedes());
calistir(new Seat());
}
public void calistir(Araba araba){
araba.hizlan();
}
public class Araba {
public void hizlan(){
System.out.println("Araba Hızlandı.");
}
}
public class Mercedes extends Araba {
@Override
public void hizlan() {
System.out.println("Mercedes Hızlandı."); //Araba sınıfındaki hizlan() mercedes
} // sınıfına göre biçimlendi.
}
public class Bmw extends Araba {
@Override
public void hizlan() {
System.out.println("Bmw Hızlandı."); // Araba sınıfındaki hizlan()
} // Bmw sınıfına göre biçimlendi.
}
public class Seat extends Araba {
@Override
public void hizlan() { // super ile araba sınıfındaki
super.hizlan(); // hizlan metodunu çağırdık.
}
}