Upload
websnap
View
509
Download
0
Tags:
Embed Size (px)
Citation preview
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 1
Başlangıç Durumuna Getirme ve Temizlik
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 2
Hataların sebepleri...
• Nesnelerin yanlış biçimde başlangıç durumlarınagetirilmesi
– Uygulamayı yazan kişi bilmediği kütüphaneye aitnesneleri yanlış şekilde başlangıç durumuna getirmesinedeniyle hatalarla karşılaşabilir.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 3
Hataların sebepleri
• Temizlik işleminin doğru bir şekilde yapılmaması
– Oluşturulmuş ve kullanılmayan nesnelerin, sistemkaynaklarında gereksiz yere var olması ile bellek problemleri ortaya çıkabilir.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 4
Başlangıç durumuna getirme işlemi ve yapılandırıcılar
• Bir nesnenin başlangıç durumuna getirilme işlemi(initialization), bir sanatçının sahneye çıkmadan evvelkiyaptığı son hazırlık gibi düşünülebilir.
• Oluşturulacak olan nesne kullanıma sunulmadan evvel bazıbilgilere ihtiyaç duyabilir veya bazı işlemlerigerçekleştirmesi gerekebilir (JDBC, konfigurasyon dosyası yüklenmesi gibi).
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 5
Yapılandırıcılar (Constructor)
• Yapılandırıcılar içerisinde nesne oluşturulmadan önceki son hazırlıklar yapılır.
• Yapılandırıcılar normal yordamlardan (method) farklıdırlar.• Yapılandırıcılar, Java tarafından otomatik olarak çağrılırlar.• Karşımıza çıkan iki problem
– Java Yapılandırıcının ismini nasıl bilecektir ?– Yapılandırıcının ismi başka yordamların isimleriyle
çakışmamalıdır.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 6
Problemin Çözümü
• Bu problemlere ilk çözüm C++ dilinde bulunmuştur.• Yapılandırıcının ismi ile sınıf ismi bire bir aynı olmalıdır.• Böylece Java, yapılandırıcının ismini önceden tahmin
edebilecektir.
• İsim karışıklığı minimuma indirgenmiş olur.
YapilandirciBasitOrnek.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 7
Yapılandırıcılar (Constructor) - 2
• Yapılandırıcılara parametreler aktarılabilir.• Yapılandırıcı içerisinden herhangi bir şekilde return ifadesi ile değer döndürülemez. (return 5, return true gibi)
• Yapılandırıcılardan çıkmak istiyorsak sadecereturn yazılması yeterlidir...
YapilandirciBasitOrnekVersiyon2.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 8
Adaş Yordamlar (Overloaded Methods)
• İyi bir uygulama yazmak her zaman iyi bir takım çalışmasıgerektirir.
• Uygulamalardaki yordam (method) isimlerinin, yordam içerisinde yapılan iş ile uyum göstermesi önemlidir.
• Bu sayade bir başka kişi sadece yordam ismine bakarak, içerisinde oluşan olayları anlayabilme şansına sahiptir.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 9
Örnek - 1
• Elimizde bulunan–muzik–resim–text
formatındaki dosyaları açmak için yordamlar yazmakistersek, bu yordamların isimlerinin ne olması gerekir ?
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 10
Örnek - 1 (devam)
Yordam isimleri olarak
• muzik dosyası için muzikDosyasiAc()
• resim dosyası için resimDosyasıAc()
• text dosyası için textDosyasıAc()
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 11
Örnek - 1 (devam)
• Sonuçta işlem sadece dosya açmaktır, dosyanın türü sadecebir ayrıntıdır.
MetodOverloadingDemo1.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 12
Adaş yordamlar nasıl ayırt edilir ?
• Java aynı isimde olan yordamları (overloaded methods) nasıl ayırt edebilmektedir ?
• Her yordamın kendisine özel/tek parametresi veyaparametre listesi olmak zorundadır.
MetodOverloadingDemo2.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 13
Adaş yordamlar dönüş değerlerine göre ayırt edilebilir mi ?
• Akıllara şöyle bir soru gelebilir : "Adaş yordamlar dönüştiplerine göre ayırt edilebilir mi ? "
void toplamaYap();
double toplamaYap();
double y = toplamayap() ;
toplamayap() ; // sorun var
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 14
Varsayılan yapılandırıcılar (Default constructors)
• Eğer uygulamamıza herhangi bir yapılandırıcı koymazsakJava bu işlemi kendi otomatik olarak yapmaktadır.
• Varsayılan yapılandırcılar (parametresiz yapılandırcılar, default constructor veya "no-args" constructor) içi boş biryordam olarak düşünülebilir.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 15
Örnek - 2
class Kedi {int i;
}
public class VarsayilanYapilandirici {public static void main(String[] args) {
//Varsayılan yapılandırıcı çağrıldıKedi kd = new Kedi();
}}
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 16
Örnek - 2 (devam)
class Kedi { int i;/* varsayılan yıpılandırıcı.
Bu yapılandırıcıyı eğer biz koymasaydık Java bizim yerimize zaten koyardı
*/public Kedi() {}
}
public class VarsayilanYapilandirici {public static void main(String[] args) {// varsayılan yıpılandırıcıKedi kd = new Kedi();
}}
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 17
Büyünün Bozulması
• Eğer kendimiz yapılandırıcı yazarsak, Java bizdenvarsıyılan yapılandırıcı desteğini çekecektir.
• Kendimize ait özel yapılandırıcılar tanımlarsak Java’ya"Ben ne yaptığımı biliyorum, lütfen karışma" demişoluruz.
VarsayilanYapilandiriciVersiyon2.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 18
this anahtar kelimesi
• this anahtar kelimesi, içinde bulunulan nesneye ait birreferans döner.
• Bu referans sayesinde nesnelere ait global alanlara erişmefırsatı buluruz.
TarihHesaplama.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 19
Yordam cağrımlarında this kullanımı - 2
Yumurta.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 20
Bir yapılandırıcıdan diğerini çağırmak
• Yapılandırıcı içerisinden diğer bir yapılandırıcıyıçağırırken this ifadesi her zaman ilk satırda yazılmalıdır.
• Her zaman yapılandırıcılar içerisinden this ifadesi ilebaşka bir yapılandırıcı çağrılır.
• Yapılandırıcılar içersinde birden fazla this ifadesi ilebaşka yapılandırıcı çağrılamaz.
Tost.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 21
Ekran çıktısı
Tost(int sayi ,String malzeme)
Tost(int sayi)
parametresiz yapilandirici
Tost sayisi =5 malzeme =Sucuklu
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 22
Statik Alanlar (Sınıf Alanları)
• Sadece global olan alanlara statik özelliğini verebiliriz.
• Yerel değişkenlerin statik olma özellikleri yoktur.
• Statik alanlar, bir sınıfa ait olan tüm nesneler için aynıbellek alanında bulunurlar.
StatikDegisken.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 23
Kuş bakışı görüntü
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 24
Statik Yordamlar (methods)
• Statik yordamlar (sınıf yordamlar), nesnelerden bağımsızyordamlardır.
• Statik bir yordamı çağırmak için herhangi bir sınıfa aitnesne oluşturma zorunluluğu yoktur.
• Statik olmayan yordamlardan (nesneye ait yordamlar), statik yordamları rahatlıkla çağırılabilmesine karşın statikyordamlardan nesne yordamlarını doğrudan çağıramayız.
StatikTest.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 25
Bir yordamın statik mi yoksa nesne yordamı mıolacağına neye göre karar vereceğiz?
• Nesnelerin durumları (state), uygulamanın gidişine göre değişebilir.
MutluAdam.java (*)
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 26
Statik yordamlar
• Statik yordamlarlar atomik işler için kullanılırlar.
• Uygulamalarınızda çok fazla statik yordam kullanıyorsanız, tasarımınızı baştan bir kez daha gözden geçirmeniz tavsiyeolunur.
Toplama.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 27
Temizlik İşlemleri: finalize() ve çöp toplayıcı (Garbage Collector)
• Java dilinde, C++ dilinde olduğu gibi oluşturulannesnelerimizi işleri bitince yok etme özgürlüğü kodu yazankişinin elinde değildirdeğildir.
• Bir nesnenin gerçekten çöp olup olmadığına karar verenmekanizma çöp toplayıcısıdır (garbage collector).
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 28
finalize() yordamı
• Akıllarda tutulması gereken diğer bir konu ise eğeruygulamanız çok fazla sayıda çöp nesnesi (kullanılmayannesne) üretmiyorsa, çöp toplayıcısı (garbage collector) devreye girmeyebilir.
• Bir başka önemli nokta;– System.gc()
ile çöp toplayıcısını tetiklemezsek , çöp toplayıcısının nezaman devreye girip çöp haline dönüşmüş olan nesneleribellekten temizleneceği bilinemez.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 29
System.gc()
Temizle.java
Temizle2.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 30
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 31
Çöp toplayıcısı (Garbage Collector) nasıl çalışır?
• Çöp toplayıcısının temel görevi, kullanılmayan nesneleribularak bunları bellekten silmektir.
• Sun Microsystems tarafından tanıtılan Java HotSpot VM (Virtual Machine) sayesinde heap bölgesindeki nesnelernesillerine göre ayrılmaktadır.
– Eski Nesil – Yeni Nesil
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 32
Çöp toplayıcısı (Garbage Collector) nasıl çalışır?
• Nesnelerin bellekten silinmesi görevi kodu yazan kişiye aitdeğildir.
• Bu görev çöp toplayıcısına aittir. Java 1.3.1 ve daha sonraki Java versiyonları iki noktayı garanti eder;
– Kullanılmayan nesnelerin kesinlikle bellekten silinmesi. – Nesne bellek alanının parçalanmasını engellemek ve belleğin
sıkıştırılması.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 33
Çöp toplama teknikleri
• Eski yöntem
– Referans Sayma Yöntemi
• Yeni Yöntemler
– Kopyalama yöntemi (Copy)– İşaretle ve süpür yöntemi (Mark and Sweep)– Artan (sıra) yöntem (Incremental)
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 34
Heap Bölgesine Bakış
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 35
Heap bölgesinin boyutları nasıl kontrol edilir.
• Heap bölgesine minimum veya maksimum değerleri vermekiçin -Xms veya -Xmx parametlerini kullanırız.
java -Xms32mb Temizle
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 36
Kopyalama yönteminin gösterimi
• Birazdan gösterilecek olan şeklimizde, canlı nesnelerkırmızı renk ile ifade edilmiştir.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 37
Aşama – 1
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 38
Aşama – 2
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 39
Aşama – 3
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 40
İşaretle ve süpür yönteminin gösterimi
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 41
Kopyala yöntemin ve işaretle ve süpür yöntemi
HeapGosterim.java
java -verbosegc HeapGosterim
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 42
Uygulamanın Çıktısı
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 43
Alanlara ilk değerleri atama
• Java uygulamalarında üç tür değişken çeşiti bulunur:
– Yerel (local) değişkenler.
– Nesneye ait global alanlar.
– Sınıfa ait global alanlar (statik alanlar).
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 44
Örnek - 3
DegiskenGosterim.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 45
Yerel Değişkenler
public int hesapla () { // yerel değişkenlere ilk değerleri her zaman//verilmelidir.
int i ;
i++; // ! Hata ! ilk deger verilmeden üzerinde işlem yapılamaz
return i ;
}
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 46
Nesneye ait global alanlar – ilkel tipler
IlkelTipler.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 47
Nesneye ait global alanlar - sınıf tipleri
NesneTipleri.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 48
Sınıflara ait global değişkenler - ilkel tipler
• Önemli Nokta: Statik olan alanlara sadece bir kere değer atanır.
IlkelTiplerStatik.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 49
Sınıflara ait global değişkenler – sınıf tipleri
StatikNesneTipleri.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 50
İlk değerleri atarken yordam kullanımı
KarisikTipler.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 51
İlk değer verme sıralaması
• Nesneye ait global alanlara ilk değer hemen verilir, hattayapılandırıcıdan bile önce...
• Alanların konumu hangi sırada ise ilk değer vermesıralaması da aynı sırada olur.
Defter.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 52
Statik ve statik olmayan alanların değer alma sıralaması
• Statik alanlar sınıflara ait olan alanlardır ve statik olmayan(nesneye ait alanlar) alanlara göre ilk değerlerini daha öncealırlar.
Kahvalti.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 53
Statik alanlara toplu değer atama
• Statik alanlarımıza toplu olarak değer atama.
StatikTopluDegerAtama.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 54
Statik olmayan alanlara toplu değer atama
NonStatikTopluDegerAtama.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 55
Diziler (Arrays)
• Diziler nesnedir.
• Dizi nesnesi, içinde belli sayıda eleman bulundurur.
• Dizi içerisindeki ilk elemanın konumu 0 'dan başlar, son elemanın yeri ise n-1 'dir.
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 56
Dizi tipindeki değişkenler
double[] dd ; // double tipindeki dizidouble dd[] ; // double tipindeki dizifloat [] fd ; // float tipindeki diziObject[] ao ; // Object tipindeki dizi
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 57
Dizileri oluşturmak
double[] d = new double[20] ; double dd[] = new double[20]; float [] fd = new float [14];
Object[] ao = new Object[17]; String[] s = new String[25] ;
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 58
Dizilerin tekrardan boyutlandırılması
int liste[] = new int[5] ;
// yeni bir dizi nesnesine bağlandı
liste = new int[15] ;
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 59
Dizi içerisindeki elemalara ulaşım
DiziElemanlariGosterimBir.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 60
Diziler içerisinde elemanların sıralanması
DiziSiralama.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 61
Dizilerin dizilere kopyalanması
DizilerinKopyalanmasi.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 62
Çok Boyutlu Diziler
Dizi içerisinde dizi tanımlanabilir.
int[][] t1 = {
{ 1, 2, 3, },
{ 4, 5, 6, },
};
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 63
Çok boyutlu dizileri oluşturmanın diğer bir yolu
int [][] t1 = new int [3][4] ;
int [][] t1 = new int [][4] ; //!Hata!
CokBoyutluDizilerOrnekBir.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 64
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 65
Değişik boyuta sahip diziler
CokBoyutluDiziler.java
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 66
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 67
Sorular ...