Top Banner
© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 1 Başlangıç Durumuna Getirme ve Temizlik
67
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 1

Başlangıç Durumuna Getirme ve Temizlik

Page 2: Java Eğitimi - Bolum 3

© 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.

Page 3: Java Eğitimi - Bolum 3

© 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.

Page 4: Java Eğitimi - Bolum 3

© 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).

Page 5: Java Eğitimi - Bolum 3

© 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.

Page 6: Java Eğitimi - Bolum 3

© 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

Page 7: Java Eğitimi - Bolum 3

© 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

Page 8: Java Eğitimi - Bolum 3

© 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.

Page 9: Java Eğitimi - Bolum 3

© 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 ?

Page 10: Java Eğitimi - Bolum 3

© 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()

Page 11: Java Eğitimi - Bolum 3

© 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

Page 12: Java Eğitimi - Bolum 3

© 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

Page 13: Java Eğitimi - Bolum 3

© 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

Page 14: Java Eğitimi - Bolum 3

© 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.

Page 15: Java Eğitimi - Bolum 3

© 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();

}}

Page 16: Java Eğitimi - Bolum 3

© 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();

}}

Page 17: Java Eğitimi - Bolum 3

© 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

Page 18: Java Eğitimi - Bolum 3

© 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

Page 19: Java Eğitimi - Bolum 3

© 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

Page 20: Java Eğitimi - Bolum 3

© 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

Page 21: Java Eğitimi - Bolum 3

© 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

Page 22: Java Eğitimi - Bolum 3

© 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

Page 23: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 23

Kuş bakışı görüntü

Page 24: Java Eğitimi - Bolum 3

© 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

Page 25: Java Eğitimi - Bolum 3

© 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 (*)

Page 26: Java Eğitimi - Bolum 3

© 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

Page 27: Java Eğitimi - Bolum 3

© 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).

Page 28: Java Eğitimi - Bolum 3

© 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.

Page 29: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 29

System.gc()

Temizle.java

Temizle2.java

Page 30: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 30

Page 31: Java Eğitimi - Bolum 3

© 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

Page 32: Java Eğitimi - Bolum 3

© 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ı.

Page 33: Java Eğitimi - Bolum 3

© 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)

Page 34: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 34

Heap Bölgesine Bakış

Page 35: Java Eğitimi - Bolum 3

© 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

Page 36: Java Eğitimi - Bolum 3

© 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.

Page 37: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 37

Aşama – 1

Page 38: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 38

Aşama – 2

Page 39: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 39

Aşama – 3

Page 40: Java Eğitimi - Bolum 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

Page 41: Java Eğitimi - Bolum 3

© 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

Page 42: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 42

Uygulamanın Çıktısı

Page 43: Java Eğitimi - Bolum 3

© 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).

Page 44: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 44

Örnek - 3

DegiskenGosterim.java

Page 45: Java Eğitimi - Bolum 3

© 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 ;

}

Page 46: Java Eğitimi - Bolum 3

© 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

Page 47: Java Eğitimi - Bolum 3

© 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

Page 48: Java Eğitimi - Bolum 3

© 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

Page 49: Java Eğitimi - Bolum 3

© 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

Page 50: Java Eğitimi - Bolum 3

© 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

Page 51: Java Eğitimi - Bolum 3

© 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

Page 52: Java Eğitimi - Bolum 3

© 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

Page 53: Java Eğitimi - Bolum 3

© 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

Page 54: Java Eğitimi - Bolum 3

© 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

Page 55: Java Eğitimi - Bolum 3

© 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.

Page 56: Java Eğitimi - Bolum 3

© 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

Page 57: Java Eğitimi - Bolum 3

© 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] ;

Page 58: Java Eğitimi - Bolum 3

© 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] ;

Page 59: Java Eğitimi - Bolum 3

© 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

Page 60: Java Eğitimi - Bolum 3

© 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

Page 61: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 61

Dizilerin dizilere kopyalanması

DizilerinKopyalanmasi.java

Page 62: Java Eğitimi - Bolum 3

© 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, },

};

Page 63: Java Eğitimi - Bolum 3

© 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

Page 64: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 64

Page 65: Java Eğitimi - Bolum 3

© 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

Page 66: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 66

Page 67: Java Eğitimi - Bolum 3

© Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 3 67

Sorular ...