Anotasyon

Java Dersleri – Nesne ve Sınıf Yapısı

Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize, Temel Java Dersleri serisi altında Java Nesne ve Sınıf Yapısı konusuyla devam ediyoruz.

Önceki derslerimizde gördüğümüz Java Operatörler, Döngüler, Diziler ve diğer konular Java’nın temel yapısı için büyük önem arzetmektedir. Temel yapıları iyi öğrenmek Java ile kodlama da büyük önem taşımaktadır. Java ile kodlanan büyük ve kapsamlı projelerde hepimizin daha önceden duyduğu Nesne Yönelimli Programlama yani Object-Oriented Programming yapısı kullanılmaktadır. Nesne Yönelimli Programlama nedir sorusunun cevabını yazı dizimizin bu ve sonraki derslerinde anlatıyor olacağım. Bu ders Java Nesne ve Sınıf Yapısı ile aslında Nesne Yönelimli Programlamaya giriş yaptığımız dersimizdir.

Nesne ve Sınıf Yapısı

Java Nesne ve Sınıf yapısı kullanılarak Nesneye dayalı programlama yapılmaktadır. Aslında nesneler sınıflardan oluşmaktadır. Java’da bir sınıfı class anahtar kelimesini kullanarak tanımlayabiliriz.

Sınıf;  Nesnelerin özelliklerini ve işlevlerini tanımlayan bir şablondur.

 

Nesne; Çevremizde gördüğümüz özellikleri ve işlevleri olan her şeyi nesne olarak tanımlayabiliriz. Bu canlı veya cansız bir varlık olabilir. Örn: Telefon, bilgisayar, araba, hayvan vs. Nesnelerin özellikleri önceki derslerimizde gördüğümüz Java Veri Tipleri ile belirtilebileceği gibi yine bizim tarafımızdan oluşturulan sınıflar aracalığı ile de belirtilebilir. Nesnelerin işlevleri ise yine daha önceden gördüğümüz Metot Yapısı ile belirtilerek nesnelerin birbirleri arasındaki iletişimi sağlanır.

Sınıf

Java Nesne ve Sınıf Yapısı’nda “Nesneler sınıflardan oluşur” demiştik, o halde öncelikle sınıf yapısı nasıl oluşur ona bakalım;

public class SinifAdi {
    public degiskenTuru degiskenTuru;
    //constructor
    SinifAdi() {
    }
    //constructor
    SinifAdi(degiskenTuru yeniDegiskenTuru) {
        degiskenTuru = yeniDegiskenTuru;
    }
    //metot
    void metotAdi() {
    } 
}

Genel olarak Java’da sınıf tanımlaması yukarıdaki şekilde yapılmaktadır. Daha iyi anlaşılabilmesi için bir Araba sınıfı üretelim ve bu sınıf üzerinden örneklerimize devam edelim.

public class Araba {
    
    public double varsayilanMotorHacmi;
    
    //constructor
    Araba() {

    }

    //constructor
    Araba(double yeniMotorHacmi) {
        varsayilanMotorHacmi = yeniMotorHacmi;
    }

    //metot
    void calistir() {
        //Araba calisiyor...
    }
}

Sanırım şimdi özellik ve işlevsellik demekle  neyi kast ettiğim daha iyi anlaşıldı. Bir araba sınıfı içerisinde arabaların genel bir özelliği olarak motorHacmi tanımlanmıştır. Ayrıca işlevsellik olarakta calistir() metodu oluşturulmuştur. Burada özellik olarak rengi, yapısı, ağırlığı vb. bir sürü özellik eklenebilir. Yine aynı şekilde sinyalVer(), camAc() veya bagajAc() gibi bir çok işlevsellik eklenebilir. Özellikler ve işlevsellikler tamamen geliştiricinin ihtiyacına göre düzenlenebilir.

Constructor (Yapıcı Metot)

Burada daha önce görmediğimiz constructor yapısı bulunmaktadır. Aslında Java’da bir sınıf oluşturduğumuzda constructor yani yapıcı metotlar büyük önem taşımaktadır. Biz kod yazarken herhangi bir constructor metot tanımlamasak bile Java bizim için bir tane constructor metot oluşturmaktadır. Constructor metotlar bir sınıftan bir nesne oluşturulduğunda ilk çalışan metotlardır. Bu metotlar aracılığı ile sınıflara ilk çalıştıklarında vermek istediğimiz değerleri verebilir, varsayılan değerlere farklı değerler atayabilir veya bir metot çalıştırabiliriz.

Oluşturduğumuz sınıfın yapısını daha net görebilmek adına görsel olarak bir tanımlama yapabilir.z Bir sınıfı görsel olarak anlatmanın yöntemi Unified Modeling Language yani UML kullanarak UML class diagram oluşturmakla mümkündür. Burada sınıfın adı, içindeki veri tipi alanları, constructor ve metotları görüntülenebilir. Yukarıda bizim tanımladığımız Araba sınıfına ait Sınıf Diagramı şu şekildedir;

 

Nesne

Java Nesne ve Sınıf Yapısında nesnelerin sınıflardan oluştuğunu daha önce söylemiştim. Sınıf yapısını gördüğümüze göre artık sınıflardan nasıl nesne oluşturulduğunu görebiliriz. En basit ve genel yöntemle;

SinifAdi sinifAdi = new SinifAdi();

şeklinde bir tanımlama ile sinifAdi nesnesi oluşturulabilir. Yine daha iyi anlaşılması için Araba sınıfımız üzerinden devam edelim. Öncelikle Araba sınıfımızda biraz değişiklik yapalım ve araba nesnemizi oluşturalım.

public class Araba {

    public double varsayilanMotorHacmi = 1399;

    //constructor
    Araba() {
        System.out.println("Araba nesnesi oluşturuldu, varsayilan motor hacmi değeri: " + varsayilanMotorHacmi);
    }

    //constructor
    Araba(double yeniMotorHacmi) {
        varsayilanMotorHacmi = yeniMotorHacmi;
        System.out.println("Araba nesnesi oluşturuldu, yeni varasayilan motor hacmi değeri:  " + varsayilanMotorHacmi);
    }

    //metot
    void calistir() {
        System.out.println("Araba çalışmaya başladı!");
    }
}

Araba sınıfında yaptığımız değişiklikler sonucu, bu sınıftan nesne oluşturduğumuzda konsoldaki çıktılarla nesne oluşurken işlemlerin hangi sırayla çalıştığını daha net anlayacağız. Bir tane ArabaTest sınıfı oluşturalım ve bu sınıf içerisinde Araba sınıfından bir nesne oluşturalım ve calistir() metodunu çağıralım.

public class ArabaTest {

    public static void main(String[] args) {

        Araba arabaNesnesi = new Araba();
        arabaNesnesi.calistir();

        Araba baskaArabaNesnesi = new Araba(2997);
        baskaArabaNesnesi.calistir();

    }

}

Öncelikle yukarıdaki kodu çalıştırdığımızda çıktısının ne olacağına bir göz atalım.

Araba nesnesi oluşturuldu, varsayilan motor hacmi değeri: 1399.0
Araba çalışmaya başladı!
Araba nesnesi oluşturuldu, yeni varasayilan motor hacmi değeri:  2997.0
Araba çalışmaya başladı!

Araba arabaNesnesi = new Araba(); şeklinde oluşturduğumuz nesnemizde sizlerin de dikkatinden kaçmayacağı gibi parametre almayan constructor kullanılarak bir nesne oluşturuldu. Sınıftan yeni bir nesne oluşturulurken constructor devreye girdi ve görevini yerine getirdi. Aynı şekilde Araba baskaArabaNesnesi = new Araba(2997); şeklinde oluşturulan nesnede ikinci constructor yani içerisine double yeniMotorHacmi değerini alan constructor devreye girdi ve görevini tamamladı. Araba sınıfından nesne oluşturduktan sonra calistir() methodunu yine bizim tetiklememiz gerekti, işte metotlarla constructor farkı burada ortaya çıkıyor. Kısaca toparlamak gerekirse; constructor lar sınıflardan nesne oluşturuluğu esnada tetiklenmekte, metotlar ise nesne oluşturulup çağırıldıktan sonra tetiklenmektedir.

Getter ve Setter Metotlar

Değinmemiz gereken önemli, bir o kadar kullanışlı ve işimize yarayacak bir konu da getter ve setter metotlarıdır. Sınıflar içerisinde tanımlanan constructor ve metotların yanı sıra bir de değişkenler vardır. Değişkenler bir sınıf tanımlanırken ulaşım yapısı dikkat edilerek tanımlanması gereken yapılardır. Bu dersimizde getter ve setter metotlarından değişkenlere erişimin nasıl sağlanacağıyla ilgili fikir vermesi için bahsediyor olacağız. Erişim yetkilerine yönelik dersimizde getter ve setter yapısından daha kapsamlı bir şekilde bahsedeceğiz. Araba sınıfımız içerisinde varsayilanMotorHacmi değişkeni bulunmaktadır. Eğer varsayilanMotorHacmi değişkenimizin değerini değiştirmek istiyorsak direkt olarak çağırarak değil de getter setter yapısını kullanarak yapmak en doğru yaklaşımdır. Aşağıdaki örneği inceleyerek ne demek istediğimi daha net bir şekilde anlayabilirsiniz.

public class ArabaTest {

    public static void main(String[] args) {

        Araba arabaNesnesi = new Araba();
        arabaNesnesi.calistir();

        Araba baskaArabaNesnesi = new Araba(2997);
        baskaArabaNesnesi.calistir();

        System.out.println(baskaArabaNesnesi.varsayilanMotorHacmi);

        baskaArabaNesnesi.varsayilanMotorHacmi = 5997;

        System.out.println(baskaArabaNesnesi.varsayilanMotorHacmi);

    }

}

yerine Araba sınıfını aşağıdaki gibi tanımladıktan sonra;

public class Araba {

    private double varsayilanMotorHacmi = 1399;

    //constructor
    Araba() {
        System.out.println("Araba nesnesi oluşturuldu, varsayilan motor hacmi değeri: " + varsayilanMotorHacmi);
    }

    //constructor
    Araba(double yeniMotorHacmi) {
        varsayilanMotorHacmi = yeniMotorHacmi;
        System.out.println("Araba nesnesi oluşturuldu, yeni varasayilan motor hacmi değeri:  " + varsayilanMotorHacmi);
    }

    //metot
    void calistir() {
        System.out.println("Araba çalışmaya başladı!");
    }

    public double getVarsayilanMotorHacmi() {
        return varsayilanMotorHacmi;
    }

    public void setVarsayilanMotorHacmi(double varsayilanMotorHacmi) {
        this.varsayilanMotorHacmi = varsayilanMotorHacmi;
    }
}

ArabaTest sınıfında varsayilanMotorHacmi değişkeniyle ilgili değişiklikleri aşağıdaki gibi yapmak daha doğru bir yaklaşım olacaktır.

public class ArabaTest {

    public static void main(String[] args) {

        Araba arabaNesnesi = new Araba();
        arabaNesnesi.calistir();

        Araba baskaArabaNesnesi = new Araba(2997);
        baskaArabaNesnesi.calistir();

        System.out.println(baskaArabaNesnesi.getVarsayilanMotorHacmi());

        baskaArabaNesnesi.setVarsayilanMotorHacmi(5997);

        System.out.println(baskaArabaNesnesi.getVarsayilanMotorHacmi());

    }

}

Sonuç

Object Oriented Programming yapısının temel taşlarından olan Nesne ve Sınıf Yapısı’nı iyi kavramakta fayda var. Sonraki derslerimizde Nesne ve Sınıf Yapısı‘nı ne kadar çok kullandığımızı görünce sizler de bana hak vereceksiniz.

Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.

Tüm Temel Java Dersleri için tıklayınız..

87

Eren Başaran

Software Developer
Mobilhanem Yazarı

9 Yorum

  • Gerçekten çok iyi bir ders olmuş. Özellikle nesne oluşurken gerçekleşen işlemlerin sırası konusu müthiş olmuş.

  • Devamını iple çekiyoruz kardeşim, ellerine sağlık. Devamında takibindeyiz, 5-6 arkadaş her gün sitendeyiz son 4 gündür.

    • Hocam merhaba, benim nesne ile ilgili bir sorum olacaktı.. biz burada Araba baskaAraba = new Araba(2997) diyoruz ama bu bazı yerlerde (new 2997) olarak yazılıyor. Farkını söylerseniz çok memnun olurum. teşekkür ederim şimdiden.

  • Çok güzel anlatım, ellerinize sağlık. Fakat setter-getter açıklamalarıyla eklenebilse daha verimli olabilirdi. İyi çalışmalar.

  • teşekkürler çok yararlı bir içerik olmuş. Python ile ilgili makine öğrenmesi ile ilgili makaleler de görmek isteriz.

  • Hocam merhaba, benim nesne ile ilgili bir sorum olacaktı.. biz burada Araba baskaAraba = new Araba(2997) diyoruz ama bu bazı yerlerde (new 2997) olarak yazılıyor. Farkını söylerseniz çok memnun olurum. teşekkür ederim şimdiden.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?