Object Oriented Programming (OOP), yani Nesne Yönelimli Programlama günümüzde yaygın olarak kullanılan bir programlama paradigmalarından biridir. Bu programlama yaklaşımı, bir programın temelini oluşturan veri yapılarını ve bunların üzerinde işlem yapan işlevleri birleştirerek, programlama işlemlerini nesnelere dayandırır. Nesne Yönelimli Programlama, programlama dillerinde bulunan sınıf, nesne, miras, soyutlama, çok biçimlilik gibi kavramları içerir. Bu yazımızda, Java programlama dilinde Nesne Yönelimli Programlama konusunu açıklayacağız.

Sınıflar ve Nesneler

Java’da Nesne Yönelimli Programlama’nın temelinde sınıflar ve nesneler bulunur. Sınıflar, bir program içerisinde yer alan veri yapılarını ve bu veri yapıları üzerinde işlem yapacak olan fonksiyonları bir arada tutan yapılardır. Sınıfların içerisindeki fonksiyonlar, sınıf içerisindeki değişkenlerle birlikte çalışarak, o sınıfa özgü işlemleri gerçekleştirir.

Nesneler ise, bir sınıfın örnekleridir. Bir sınıf, örneklenerek birden fazla nesne oluşturulabilir. Nesneler, sınıfların özelliklerini ve işlemlerini taşıyan yapılar olarak düşünülebilirler. Her nesne, ayrı bir bellek bölgesinde saklanır ve diğer nesnelerden bağımsızdır.

Java’da bir sınıf oluşturmak için “class” anahtar kelimesi kullanılır. Aşağıdaki örnekte, “Araba” adında bir sınıf tanımlanmaktadır:

public class Araba {
    // sınıfın değişkenleri
    String marka;
    String model;
    int yil;

    // sınıfın fonksiyonları
    public void calistir() {
        System.out.println("Araba çalıştırıldı!");
    }

    public void durdur() {
        System.out.println("Araba durduruldu!");
    }
}

Bu sınıfta, “marka”, “model” ve “yil” adında üç değişken tanımlanmıştır. Ayrıca, “calistir()” ve “durdur()” adında iki fonksiyon da yer almaktadır. Bu fonksiyonlar, Araba sınıfına özgü işlemleri gerçekleştirir.

Sınıftan bir nesne oluşturmak için, “new” anahtar kelimesi kullanılır. Aşağıdaki örnekte, “Araba” sınıfından “toyota” adında bir nesne oluşturulmuştur:

Araba toyota = new Araba();

Bu örnekte, “toyota” adında bir nesne oluşturulmuştur ve bu nesne, “Araba” sınıfının özelliklerini ve işlemlerini taşımaktadır. Artık “toyota” nesnesi üzerinden, Araba sınıfına özgü işlemler gerçekleştirilebilir. Örneğin, “calistir()” fonksiyonu şu şekilde çağrılabilir:

toyota.calistir();

Bu kod parçası, “toyota” nesnesinin “calistir()” fonksiyonunu çağırarak, Araba sınıfına özgü bir işlem gerçekleştirir.

Inheritance (Katılım, Miras) Nedir ?

OOP’de , sınıflar arasında bir tür hiyerarşi kurulabilir. Bir sınıfın özelliklerini ve işlemlerini diğer bir sınıfın kullanması için, miras mekanizması kullanılır. Miras, bir sınıfın başka bir sınıftan özelliklerini ve işlemlerini devralmasıdır.

Java’da bir sınıfın başka bir sınıftan miras alması için “extends” anahtar kelimesi kullanılır. Aşağıdaki örnekte, “SporAraba” sınıfı, “Araba” sınıfından miras almaktadır:

public class SporAraba extends Araba {
    // yeni özellikler
    int hiz;
    double 0_100;

    // yeni fonksiyonlar
    public void hizlan() {
        System.out.println("Hızlanılıyor!");
    }

    public void dur() {
        System.out.println("Duruluyor!");
    }
}

Bu örnekte, “SporAraba” sınıfı, “Araba” sınıfından miras alarak, Araba sınıfının özelliklerini ve işlemlerini kullanabilir. Ayrıca, “hiz” ve “0_100” adında iki yeni özellik de tanımlanmıştır. “hizlan()” ve “dur()” adında iki yeni fonksiyon da sınıfa eklenmiştir.

Konu hakkında detaylı bilgi için : Java Inheritance (Kalıtım) Kavramı ve Kullanımı

Bu yazı dikkatini çekebilir.   Java For Döngüsü

Abstraction (Soyutlama) Nedir ?

Soyutlama, OOP’de önemli bir kavramdır. Soyutlama, bir nesnenin özelliklerini ve işlemlerini soyut bir şekilde ele alarak, o nesnenin farklı türlerde kullanılabilmesini sağlar.

Java’da soyutlama mekanizması, “interface” adı verilen bir yapı ile sağlanır. “interface” yapısı, bir sınıfın uyması gereken kuralları belirler. Aşağıdaki örnekte, “Araba” sınıfı, “Arac” adında bir interface’den miras almaktadır:

public interface Arac {
    public void calistir();
    public void durdur();
}

Bu örnekte, “Arac” interface’inde, “calistir()” ve “durdur()” adında iki fonksiyon tanımlanmıştır. “Araba” sınıfı, “Arac” interface’inden miras alarak, bu iki fonksiyonu tanımlamak zorundadır:

public class Araba implements Arac {
    // Araba sınıfının özellikleri
    String marka;
    String model;
    int yil;
    int hiz;
    
    // Araba sınıfının işlemleri
    public void calistir() {
        System.out.println("Araba çalıştı.");
    }

    public void durdur() {
        System.out.println("Araba durdu.");
    }

    public void hizlan() {
        hiz += 10;
        System.out.println("Hız artırıldı. Yeni hız: " + hiz);
    }

    public void yavasla() {
        hiz -= 10;
        System.out.println("Hız azaltıldı. Yeni hız: " + hiz);
    }

    public void bilgileriYazdir() {
        System.out.println("Marka: " + marka);
        System.out.println("Model: " + model);
        System.out.println("Yıl: " + yil);
        System.out.println("Hız: " + hiz);
    }
}

Bu örnekte, “Araba” sınıfı, “Arac” interface’inden miras alarak, “calistir()” ve “durdur()” fonksiyonlarını tanımlamak zorundadır. “Araba” sınıfına, “hizlan()”, “yavasla()” ve “bilgileriYazdir()” fonksiyonları da eklenmiştir.

Konu hakkında detaylı bilgi için : Java Abstraction (Soyutlama) Nedir ? Abstraction Örnekleri

Polimorfizm (Çok Biçimlilik) Nedir ?

OOP’de oldukça önemli kavramlardan biriside polimorfizmdir. Polimorfizm, aynı işlemi farklı şekillerde gerçekleştirebilen nesnelerin kullanımını ifade eder.

Java’da polimorfizm, bir nesnenin farklı şekillerde kullanılabilmesini sağlayan bir mekanizma ile sağlanır. Bu mekanizma, “polymorphic reference” adı verilen bir yapıdır. Aşağıdaki örnekte, “Araba” sınıfından bir nesne oluşturulur ve bu nesne, “Arac” interface’inden referans alır:

Arac araba1 = new Araba();

Bu örnekte, “araba1” adında bir “Arac” referansı oluşturulmuştur. Bu referans, “Araba” sınıfından bir nesneye bağlanmıştır. Bu sayede, “araba1” nesnesi, hem “Arac” interface’indeki fonksiyonları kullanabilir, hem de “Araba” sınıfına özgü fonksiyonları kullanabilir.

Çıktı:

Araba çalıştı.
Hız artırıldı. Yeni hız: 10
Marka: Toyota
Model: Corolla
Yıl: 2021
Hız: 10

Bu örnekte, “araba1” nesnesinin “calistir()” fonksiyonu çağrılmıştır. Ayrıca, “hizlan()” fonksiyonu da çağrılarak, “Araba” sınıfına özgü bir işlem gerçekleştir.

Konu hakkında detaylı bilgi için : Java Polymorphism (Çok Biçimlilik) Nedir ? Polymorphism Örnek Kullanımı


Nesne Yönelimli Programlama, yazılım geliştirme sürecinde büyük bir esneklik ve verimlilik sağlar. Nesne Yönelimli Programlama, kodun daha okunaklı, anlaşılır ve yeniden kullanılabilir olmasına yardımcı olur. Ayrıca, güvenli ve hatasız kod yazmak için de yardımcı olabilir.

Bu yazıda, Nesne Yönelimli Programlama kavramlarının temellerini ve Java programlama dilinde nasıl uygulandıklarını öğrendiniz. Sınıflar, nesneler, özellikler ve işlevler gibi temel kavramların yanı sıra, kalıtım, çoklu kalıtım, arayüzler ve soyut sınıflar gibi daha ileri kavramları da öğrendiniz. Daha fazlası için ‘Java Dersleri‘ adlı kategorimize göz atabilirsiniz.