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..
88
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.
[…] üzerinden yürütülmektedir. Nesne ve sınıf yapılarıyla ilgili detaylı bilgiye bir önceki Nesne ve Sınıf Yapısı dersimizden […]
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.
ilk defa sınıf kavramını bu kadar güzel anladım. Teşekkürler.
ellerine sağlık
Ç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.