28 04 2013 Ana Sayfa Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Forum Yazarlık MAKALE HABER FORUM » Java'da Döngü Kullanımı - For , while ve do-while d Ana Sayfa » Windows » Java » Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar SEARCH Aranacak Kelime ... Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Reklam Yazan: Ahm et Tanriverdi Yayınlanma Tarihi: Decem ber 24, 2010 | Yorum Sayısı: 7 Java deyince akla nesne, nesne degince de akla degiskenler, metotlar ve tabi ki siniflar gelir. Bu siniflar Java kütüphanelerindeki siniflar da olabilir, kendi yazdigimiz siniflar da. Simdilik bizi asil ilgilendiren kendi yazdigimiz siniflar olacak. Hemen bir sinif örnegi yazalim: class BankaHesabi { String ad; String adres; int hesapNumarasi; double bakiye; Facebook Yazılım Mutfağı Beğen } 1.963 kişi Yazılım Mutfağı'yı beğendi. Sinifimizin adi BankaHesabi; bünyesinde ad, adres, hesapNumarasi ve bakiye adinda 4 adet degiskenimiz var. Bir banka hesabinda ne gibi islemler yapilabilir? Para yatirabiliriz, çekebiliriz, baska bir hesaba transfer edebiliriz; bakiyemizi sorabiliriz... F acebook sosy al eklentisi Simdi bütün bu islemleri yapabilmek için gerekli metotlar yazalim. void paraYatir(double miktar) { bakiye = bakiye + miktar; } RSS Takipçi Facebook 1000+ 250+ 1900+ Forumdan Son Makaleler Siniflarda kalitim, soyut (abstract) void paraCek(double miktar) { bakiye = bakiye - miktar; } siniflar, interface siniflar April-27-2013 SQL Server 2008 de Tablo Güncelleme Hatasi - Saving changes is not permitted double bakiyeBildir() { return bakiye; } April-26-2013 Passwordbox Gördügünüz gibi metotlarimiz anlasilir bir sekilde isimlendirilmis ve yaptigi islemler de gayet açik. www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx April-25-2013 1/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Bir de baska bir hesaba para transferi yapmak için bir metot yazalim. Bu digerlerinden biraz farkli: Java'da Döngü Kullanimi - For , void paraTransferiYap(double miktar, BankaHesabi alici) { paraCek(miktar); alici.paraYatir(miktar); } while ve do-while döngüleri April-25-2013 safe_mod on - curl_followlocation için alternatif April-24-2013 Para transferi yapmak için ne lazim: Bir miktar para ve baska bir banka hesabi. Dolayisiyla bu metodumuzda iki degisken kullandik; biri double tipinde, digeri ise BankaHesab i tipinde. Yani kendi olusturdugumuz sinifi degisken olarak kullandik. Reklam Simdi sinifimizi bi test edelim mi? class BankaHesabi { String ad; String adres; int hesapNumarasi; double bakiye; void paraYatir(double miktar) { bakiye = bakiye + miktar; } void paraCek(double miktar) { bakiye = bakiye - miktar; } double bakiyeBildir() { return bakiye; } void paraTransferiYap(double miktar, BankaHesabi alici) { paraCek(miktar); alici.paraYatir(miktar); } } Bağlantılar Soft Code Article CSharpTR Görsel Programlama Etiketler Java Class Sinif Nedir Extends Nedir Abstract Nedir Java'da Kalitim Interface Nedir Implements Nedir public class Main { public static void main(String[] args) { BankaHesabi b1 = new BankaHesabi(); BankaHesabi b2 = new BankaHesabi(); b1.paraYatir(100); System.out.println("b1 (para transferi yapmadan önce): " + b1.bakiyeBildir()); System.out.println("b2 (para transferi yapmadan önce): " + b2.bakiyeBildir()); Abstract Siniflar //b1 adli hesaptan b2 adli hesaba para transferi yapiyoruz: b1.paraTransferiYap(20, b2); System.out.println("b1: " + b1.bakiyeBildir()); System.out.println("b2: " + b2.bakiyeBildir()); } } Sonuç: b1 (para transferi yapmadan önce): 100.0 b2 (para transferi yapmadan önce): 0.0 b1: 80.0 b2: 20.0 www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 2/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Sinif yapilandiricilari (constructor): Her sinifin bir de yapilandiricisi vardir, olmak zorundadir. Ama biz yukaridaki örnekte yapilandirici kullanmadik, diye düsünebilirsiniz. Dogru, biz kendimiz bir yapilandirici yazmadik fakar Java bunu kendisi yapiyor zaten. class BankaHesabi { String ad; String adres; int hesapNumarasi; double bakiye; public BankaHesabi(){ } ... Eger kendimiz bir yapilandirici kullanmazsak Java bizim yerimize bos bir yapilandirici ekler. Simdi yukaridaki örnegi kendimiz bir yapilandirici kullanarak yapalim. class BankaHesabi { String ad; String adres; int hesapNumarasi; double bakiye; public BankaHesabi(String ad, String adres, int hesapNumarasi){ this.ad = ad; this.adres = adres; this.hesapNumarasi = hesapNumarasi; } Yapilandiricimiza 3 tane parametre verdik ve bu parametreleri sinifimizin basinda tanimladigimiz ad, adres ve hesapNumarasi adli degiskenlere atadik. Ben degisken isimlerini ayni yaptim ama siz karistirmamak için farkli isimler de kullanabilirsiniz veya parametre de ekleyebilirsiniz (mesela bakiye’yi ekliyebilirsiniz). this.ad = ad; Mavi renkli ad degiskeni yukaridaki sinif degiskeni, digeri ise yapilandiricimizdaki degisken. Zaten this. Seklinde yazilmasinin sebebi budur; yani sinif degiskeni olmasidir. Sinifimizi bir de bu hâliyle test edelim: BankaHesabi b1 = new BankaHesabi("Ahmet", "Yozgat", 123432); BankaHesabi b2 = new BankaHesabi("Mehmet", "Ankara", 657875); www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 3/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Yapilandiricilar ile metotlar arasindaki farklar nelerdir? · Yapilandiricinin ismi sinifin ismiyle birebir ayni olmak zorundadir. · Bir yapilandirici hiç bir zaman bir deger geri döndürmez; hattâ void seklinde de tanimlanmaz. · Bir yapilandirici çagirirken (yeni bir sinif nesnesi olusturulurken) mutlaka new anahtar sözcügü kullanilmalidir. Siniflarda kalitim (inheritance): Nesneye dayali programlama dillerinin bize sundugu en büyük avantajlardan biri, bir kere yazdigimiz nesneyi (sinifi) gerektiginde baska yerlerde defalarca kullanabilmemizdir. Öyle ki bir sinifi kullanarak baska ve daha gelismis bir sinif olusturmamiz da mümkün. Baska bir degisle öyle bir sinif yazacagiz ki, hem BankaHesabi adli sinifin bütün özelliklerine hem de arti bir takim özelliklere sahip olsun. Yukarida yazdigimiz banka hesabini kontrol eden program para yatirmaya, para çekmeye ve baska bir hesaba para transferi yapmaya olanak sagliyor. Kisacasi bütün banka hesaplarinda olmasi gereken temel özellikler. Peki bizim hesabimiz vadeli bir hesapsa, yani yatirilan paraya faiz veriliyorsa? O zaman bize bir de faiz hesaplama metodu lazim olacak. Ayri bir sinif yazip bütün bu temel metotlari tekrar yazmak pek akillica bir is olmaz degil mi? O zaman yapacagimiz sey Java’nin kalitim özelligini kullanacagiz. Yeni sinifimizin adi VadeliBankaHesab i olsun. public class VadeliBankaHesabi extends BankaHesabi{ double faizOrani; public VadeliBankaHesabi(String ad, String adres, int hesapNumarasi, double faizOrani) { super(ad, adres, hesapNumarasi); this.faizOrani = faizOrani; } } extends anahtar sözcügüne dikkat etmissinizdir. Bunun manasi sudur: VadeliBankaHesabi sinifi BankaHesabi sinifindan türemistir. super(ad, adres, hesapNumarasi); super anahtar sözcügü türenen sinifa, yani BankaHesabi sinifina atfediyor ve onun parametrelerini (ad, adres, hesapNumarasi) aliyor. www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 4/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Hiç bir metot yazmadigimiz hâlde para yatirma, çekme, transfer etme... islemlerini yapabilecegiz. Hemen test edelim: public class Main { public static void main(String[] args) { BankaHesabi b1 = new BankaHesabi("Ahmet", "Yozgat", 123432); VadeliBankaHesabi vbh = new VadeliBankaHesabi("Mehmet", "Ankara", 657875, 5.9); b1.paraYatir(100); System.out.println("b1 (para transferi yapmadan önce): " + b1.bakiyeBildir()); System.out.println("vadeli hesap (para transferi yapmadan önce): " + vbh.bakiyeBildir()); //b1 adli hesaptan vbh adli hesaba para transferi yapiyoruz: b1.paraTransferiYap(20, vbh); System.out.println("b1: " + b1.bakiyeBildir()); System.out.println("vadeli hesap: " + vbh.bakiyeBildir()); Feedback } } Sonuç: b1 (para transferi yapmadan önce): 100.0 vadeli hesap (para transferi yapmadan önce): 0.0 b1: 80.0 vadeli hesap: 20.0 Bundan sonra artik VadeliBankaHesabi sinifinin içine faiz hesaplama metodu ya da daha baska degisken ya da metotlar ekleyebiliriz... Sunu da unutmadan söyleyeyim, VadeliBankaHesabi sinifindan da baska siniflarin türemesini saglayabilir ve bütün önceki siniflarin özelliklerini kullanabiliriz. Kod yazmadan örnek vermek istiyorum. Bizim bir adet ‘Canlilar’ sinifimiz olsun ve bu siniftan baska siniflar türetelim. Bunlar ne olabilir? Bitkiler, Hayvanlar, Insanlar... Hayvanlar sinifindan SudaYasayanlar, KaradaYasayanlar siniflari türetilebilir. KaradaYasayanlar sinifindan Omurgalilar, Omurgasizlar siniflari, Omurgalilar sinifindan da (mesela) Kedi sinifi türetilebilir. Bu durumda ‘Kedi’ sinifi Omurgalilar, KaradaYasayanlar, Hayvanlar ve nihayet Canlilar siniflarinin özelliklerini almis olur. Mantik bu sekilde. Final sinifi: Eger olusturdugumuz siniftan kalitim yoluyla yeni bir sinif olusmasin istiyorsak su sekilde tanimlamaliyiz: www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 5/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar public final class Kediler { } Bu sayede artik Kediler sinifindan baska bir sinif türeyemez. Abstract (soyut) siniflar: Yukaridaki örnegimizde Hayvanlar sinifini Canlilar sinifindan olusturduk. Canlilarin ortak özellikleri nelerdir? Solunum yapmak, beslenmek... Evet bunlar bütün canlilarda var olan ortak özelliklerdir, fakat baliklar ile kedilerin solunum sekli farklidir; solucanla timsahin beslenmesi de farklidir. Eger Canlilar sinifina söyle bir metot yazsaydik ne olurdu: public void beslen(){ System.out.println("Fare yiyorum"); } Cevap basit: Hiç bir baligin isine yaramazdi bu metot. Canlilar sinifinda bir beslen() metodu olmali fakat içerigi, yani nasil olacagi canlidan canliya degismeli. O zaman nasil bir çözüm getirecegiz? Tabi ki abstract siniflar olusturarak. public abstract class Canlilar { String isim; public abstract void beslen(); public abstract void nefesAl(); public void birseyYap(){ System.out.println("bla bla"); } } Gördügünüz gibi sinifimizda beslen() ve nefesal() adli iki tane metot var; fakat bu metotlar simdiye kadar ögrendiklerimizden biraz farkli. Metotlar gövdesiz tanimlanmis. Yalnizca bu metotlarin varligi söz konusu; ne yaptiklari, nasil yaptiklari belirtilmemis. Iste bu sayede her canli bu metotlari kendi istedigi gibi sekillendirecektir. Bu iki metodun digerlerinden baska bir özelligi daha var. Abstract metotlar, bu siniftan türeyen diger siniflarda mutlaka kullanilmalidir. Yani Canlilar sinifindan türeyen Hayvanlar sinifi bu iki metotdu bir sekilde kullanmak zorundadir. abstract bir siniftan baska bir sinif türetirken extends sözcügünü kullaniyoruz: public class Kediler extends Canlilar{ www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 6/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar } Kediler sinifi Canlilar abstract sinifindan türeyen bir altsinif. Eger Eclipse ya da NetBeans gibi bir IDE kullaniyorsaniz yukaridaki kodlar hatâ verecektir. Bu hatâ Canlilar sinifi bünyesindeki abstract metotlarin override (Türkçe’de iptal etmek deniyor) edilmemesinden kaynaklaniyor. Iptal edelim: public class Kediler extends Canlilar{ public void beslen() { System.out.println("fare yiyorum"); } public void nefesAl() { System.out.println("akcigerimi kullaniyorum"); } } Iste, beslen() ve nefesAl() metotlarinin içerigini Kediler sinifinda belirlemis olduk. Bunlar, Baliklar sinifinda daha degisik olacaktir elbette. Soyut siniflardan yeni somut nesneler olusturulmaz Canlilar c = new Canlilar(); Hata verecektir. Interface siniflar: Interface’lerin bütün metotlari soyuttur ve kendinden türeyen bütün siniflarda iptal edilmesi (override) gerekir. Su sekilde olusturulur: public interface InterfaceTestSinifi { public String konus(); } Public class yerine public interface yaziyoruz. www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 7/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Interface’lerden tipki abstract siniflarda oldugu gibi somut nesneler olusturulamaz. InterfaceTestSinifi its = new InterfaceTestSinifi(); Hata verecektir. Bir interface’den baska bir sinif türetirken implements sözcügünü kullaniyoruz: public class TureyenSinif implements InterfaceTestSinifi{ public String konus() { return "Merhaba"; } } ActionListener, MouseMotionListener gibi bir çok sinif Java’nin kendi kütüphanesinden interface örneklerindendir. Java’da sinif kullanmi hakkinda simdilik söyleyeceklerim bu kadar. Insallah baska derslerde bulusmak üzere. 0 0 Tw eetle Beğen StumbleUponsubm it Submit Share Yorum ekle... Yorum yap... F acebook sosy al eklentisi Yazar Hakkında Ahmet Tanriverdi Makale Sayısı : 50 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar 14 yorum Kategori: Aynı Kategorideki Son Makaleler www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 8/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar Java ile MySQL Java'da JPanel ve MenuBar, Menu, Java ile SQL veritabani Veritabanına JSlider kullanımı MenuItem baglantisi Bağlanmak Toplam 7 Yorum Yapılmış. Sizde yorum yazmak ve soru sormak için bu linki takip edin. -Forum sayfasına yönlendirileceksinizYorumlar Guests April 27, 2013 SaaP 14:21 tam sınav öncesi çok aydınlatıcı oldu, emeğinize sağlık, teşekkürler Cevapla Alıntı Yaparak Cevapla Guests November 29, 2012 SaaA 05:19 Tebrikler güzel bir makale olmus, Ancak mesela hayvan sinifindan türeyen, bir kopek sinifin nesnesi olusturulurken Hayvan k1 = new Kopek() seklinde olusturmak ile Kopek k1 = new Kopek olusturmanin farki nedir? hayvan sinifi içerisindeki constructuri super degisken olarak kullanabilmek hatta parametre verebilmek istiyorum. 2 nesne yaratmanin farkini kavrayamadim ? hangisini nerede ve nasil kullaniyoruz. Cevapla Alıntı Yaparak Cevapla Guests July 17, 2012 SaaP 16:02 çok sagolun elleriniz dert görmesin harika bir makale Cevapla Alıntı Yaparak Cevapla Guests March 07, 2012 SaaP 23:11 enfes bir makale. Cevapla Alıntı Yaparak Cevapla Ahmet February 14, 2011 SaaA 10:40 1-) Abstract siniflarda hem is yapan (bildigimiz metotlar) hem de is yapmayan, yalnizca adi konulmus metotlar vardir. Fakat interface siniflarda ise bütün metotlar bostur; onlarin içerigini implemente ettigin sinifta kendin dolduracaksin. Isine nasil geliyorsa öyle doldurabilirsin. Fark bu. 2-) Her zaman anasiniftan extends etmiyoruz. O zaman siniflarimiz hep ayni ilkellikte kalmis olur. Java'da bütün siniflar Object nesnesinden türer. Object -> gelismis sinif -> daha gelismis sinif -> ... Buradaki en ilkel sinif Object sinifidir. Her sinif kendinden önceki sinifi temel aliyor ve kendi üzerine ek özellikler katiyor. Örnegin, 'gelismis sinif'taki her özellik 'Object' sinifinda yoktur. Eger 'daha gelismis sinif'i direkt 'Object' sinifindan türetseydik 'gelismis sinif'in bütün özelliklerine sahip olamayacakti. Cevapla Alıntı Yaparak Cevapla www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 9/10 28 04 2013 Siniflarda kalitim, soyut (abstract) siniflar, interface siniflar FORUM SON YAZILAR Siniflarda kalitim, soyut Java'da Döngü Kullanımı - (abstract) siniflar, interface For , while ve do-while siniflar döngüleri SQL Server 2008 de Tablo Java’da Akış Kontrol Güncelleme Hatasi - Saving Mekanizması (Switch-Case changes is not permitted Yapısı) Passwordbox Java’da Akış Kontrol ANA KATEGORILER YAZ & KAZAN Dersler Haber Programlama Dilleri, Veritabanları ve Veritabanı Web Genel BI & Data WareHouse diğer konulardan herhangi birinde makale yazabilecek bilgiye sahipmisiniz? Özgün ve kaliteli içerik oluşturabilirmisiniz? Eğer cevabınızevet ise ve yazdıklarınızın karşılığında da gelir elde etmek istiyorsanız hemen Windows MS Office yazarlık başvurusu yapın. Code Generator Ve Yapay Zeka Mekanizması (If-Else Koşul Yapısı) ORM Privacy © Yazılım Mutfağı 2013 www.yazilimmutfagi.com/10238/windows/java/siniflarda-kalitim-soyut-abstract-siniflar-interface-siniflar.aspx 10/10