Transcript

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

top related