Hacettepe Java Ders Notları OguzAslanturk PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 203

Java ile

Nesneye Ynelik
Programlama



Ouz Aslantrk

1 Nesneye Ynelik Programlamaya Giri............................................ 9
1.1 Modelleme ............................................................................. 9
1.2 Bilgisayar Programlar ve Modelleme ....................................... 10
1.3 Nesneye Ynelik Modelleme ................................................... 11
1.3.1 Snf ve Nesne Kavramlar .............................................. 11
1.4 Nesneye Ynelik Programlama ............................................... 13
1.5 Nesneye Ynelik zmleme ve Tasarm ................................. 15
1.6 Nesneye Ynelik Programlama Dilleri ...................................... 15
1.7 zet .................................................................................... 16
2 Java Platformu .......................................................................... 18
2.1 Platformdan Bamszlk ........................................................ 19
2.2 Java Sanal Makinesi (Java Virtual Machine - JVM) ..................... 22
2.3 Java Uygulama Programlama Arayz (Java Application
Programming Interface - API) ........................................................ 25
2.4 zet .................................................................................... 28
3 Java Dili le lgili Temel Bilgiler ................................................... 30
3.1 Szdizim Kurallar (Syntax Rules) ........................................... 30
3.1.1 Derleyiciler ................................................................... 30
3.1.2 Whitespace karakterleri ................................................. 30
3.2 Aklama Satrlar (Comment Lines) ........................................ 31
3.2.1 ile yaplan aklamalar ................................................... 32
3.2.2 * ... */ ile yaplan aklamalar ..................................... 32
3.2.3 ** ... */ ile yaplan aklamalar ................................... 33
3.3 Temel Trler (Primitive Types) ............................................... 35
3.4 Deiken Tanmlama ve lk Deer Atama (Variable Declaration and
Initialization) ............................................................................... 36
3.4.1 Deikenin Tanm Alan (Scope) ...................................... 37
3.5 leler (Operators)............................................................... 38
3.5.1 Aritmetik ileler: .......................................................... 38
3.5.2 Birleik Aritmetik leler: .............................................. 38
3.5.3 Arttrma ve Azaltma leleri: ......................................... 38
3.5.4 likisel (relational) ileler: ........................................... 40
3.5.5 Mantksal leler: ......................................................... 40
3.5.6 lelerin ncelikleri: ..................................................... 41
3.6 Denetim Deyimleri (Control Statements) ................................. 42
3.6.1 if else deyimi ......................................................... 42
3.6.2 if else if deyimi .................................................... 45
3.6.3 switch deyimi ............................................................. 46
3.7 Dngler (Loops) .................................................................. 48
3.7.1 while dngs ............................................................. 48
3.7.2 do - while dngs ..................................................... 49
3.7.3 for dngs ................................................................ 50
3.8 zet .................................................................................... 52
4 Uygulama Gelitirme Ortam ....................................................... 53
4.1 JDK ve JRE .......................................................................... 53
4.2 Java ile ilk program............................................................... 55
4.2.1 lk program .................................................................. 56
4.2.2 Derleme ....................................................................... 56
4.2.3 altrma ve main yntemi ............................................ 57
4.3 Eclipse Platformu .................................................................. 59
5 Java ile Nesneye Ynelik Programlama ......................................... 61
5.1 Snf Tanmlar ...................................................................... 61
5.2 Nesne Oluturma .................................................................. 66
5.2.1 new ileci ..................................................................... 66
5.2.2 Referans Tr ................................................................ 67
5.2.3 Yn (Heap), Yt (Stack) ve p Toplayc (Garbage
Collector) ................................................................................. 67
5.2.4 Kurucular (Constructors) ................................................ 70
5.2.5 this anahtar szc .................................................... 73
5.2.6 Kurucu Ar Ykleme (Constructor Overloading) ............... 74
5.2.7 Kurucularn Birbirini armas ........................................ 77
5.2.8 Yntem Ar Ykleme (Method Overloading) .................... 79
5.2.9 Diziler .......................................................................... 81
5.3 Sarmalama (Encapsulation) lkesi ve Eriim Dzenleyiciler (Access
Modifiers) .................................................................................... 86
5.3.1 Sarmalama lkesi .......................................................... 86
5.3.2 Paket Kavram .............................................................. 91
5.3.3 Eriim Dzenleyiciler ..................................................... 95
5.3.4 get/set Yntemleri ........................................................ 96
5.4 Snf/Nesne Deikenleri ve Yntemleri .................................. 101
5.4.1 static anahtar szc .............................................. 103
5.4.2 main yntemi ............................................................. 110
5.4.3 static kod bloklar ..................................................... 111
5.4.4 final anahtar szc ve sabit tanmlama .................... 114
5.5 Kaltm (Inheritance) ........................................................... 115
5.5.1 Nesneye Ynelik Bir Modelde Snflar Aras likiler .......... 115
5.5.2 Javada Kaltm ........................................................... 118
5.5.3 Kaltmla Gelen Nitelik ve Yntemlere Eriim ................... 125
5.5.4 protected Eriim Dzenleyici ....................................... 127
5.5.5 Kurucu Zinciri ve super Anahtar Szc ....................... 129
5.5.6 Yntemlerin Geersiz Klnmas (Method Overriding) ........ 135
5.5.7 Yntemlerde Geersiz Klmann final ile Engellenmesi .... 139
5.5.8 Object snf ............................................................... 139
5.6 okbiimlilik (Polymorphism) ............................................... 142
5.6.1 Ata Snf Referansndan Alt Snf Nesnesine Ulama ......... 142
5.6.2 Ge Balama (Late Binding) ......................................... 143
5.6.3 okbiimlilik Nasl Gerekleir? ..................................... 144
5.6.4 okbiimlilik Ne e Yarar? ........................................... 149
5.6.5 Soyut Snflar (Abstract Classes) ................................... 150
5.6.6 Arayzler (Interfaces).................................................. 164
5.7 Aykr Durumlar (Exceptions) ............................................... 175
5.7.1 try catch blou ..................................................... 178
5.7.2 finally deyimi .......................................................... 183
5.7.3 Javada Aykr Durumlar ............................................... 185
5.7.4 Programcnn Kodlad Aykr Durumlar ......................... 188
5.7.5 Aykr Durumlarn Ynetilmesi ....................................... 191
5.8 Girdi/kt (Input/Output I/O) lemleri ............................... 197
5.8.1 JavaBean Kavram ....................................................... 198
5.8.2 JavaBean Yazma Kurallar ............................................ 200
5.8.3 Seriletirme (Serialization) ........................................... 200
5.8.4 java.io.Serializable Arayz .................................. 202
5.8.5 GUI Editor Property Editor . Error! Bookmark not defined.
5.8.6 JavaBean rnei ................. Error! Bookmark not defined.
6 Eksik konular: ................................. Error! Bookmark not defined.

nsz
Bu kitap en azndan Yapsal Programlama bilen okuyucular iin
hazrlanmtr. Temel programlama bilgileri anlatlmayacak, okuyucunun
algoritma kavramn bildii ve algoritma gelitirebildii varsaylacaktr.
Amacmz Java programlama dilini ya da Java platformunu anlatmak deil,
Nesneye Ynelik Programlama yaklamn aklamak ve bu yaklam ile
uygulama gelitirmeyi retmektir. Programlama konularn renmenin
en iyi yolunun programlar yazmak olduunu dndmz iin, nesneye
ynelik programlar yazmak durumundayz ve bunun iin bir dil
kullanlmas gerekiyor. Bu kitap iin programlama dili Java olarak
seilmitir ancak benzer ierik rnein C++ dili ile de verilebilir.
Kitap ierisinde kullanlacak terimler iin genelde Trkiye Biliim Dernei
szl esas alnacak, kullanlan Trke terimlerin ngilizce karlklar da
parantez iinde verilmeye allacaktr. Karl henz oturmam ya da
kullanld balamda istenen anlam veremedii dnlen terimler iin
ise, yaygn kullanlmakta olan terimler tercih edilecek, Trke terimler ile
karlanamayan baz szckler/teknolojiler iin ngilizce terimler italik
yazlacaktr.









Giri


1 Nesneye Ynelik Programlamaya Giri
Programlar, gerek hayatta karlalan bir takm problemlerin zlmesi
iin bilgisayarlarn hzl ve doru ilem yapabilme yeteneklerinden
faydalanmak zere yazlrlar. Bilgisayarlarn hz ve kapasiteleri arttka
gelitirilen programlar da bu hz ve kapasiteden faydalanabilecek ekilde
gelierek deimektedir. Bu karlkl gelime ve deime, zaman
ierisinde program gelitirme yntemlerinde de deiikliklere neden olmu,
bylece eitli program gelitirme yaklamlar ortaya kmtr.
Nesneye Ynelik Yazlm Gelitirme (Object Oriented Software
Development), bir yazlm gelitirme yaklamdr. Nesneye ynelik
yaklam dnda eitli yaklamlar da bulunmakla birlikte (Yapsal
Programlama (Structured Programming), Bileen Tabanl Yazlm
Gelitirme (Component Based Software Development), Bakml
Programlama (Aspect Oriented Programming)... ) kendisinden nceki
yaklamlarn baz aklarn kapatan, kendisinden sonraki yaklamlarn
(ounun) da alt yapsn oluturan bir yaklam olarak olduka geni
kullanm alan bulmutur.
1.1 Modelleme
Gerek hayattaki problemleri bilgisayarn sanal ortamnda zebilmek iin,
hereyden nce problemin uygun ekilde bilgisayar ortamna aktarlmas
gerekmektedir. Bu ilem soyutlama (abstraction) ya da modelleme
(modeling) olarak anlr.
Modelleme, insann problem zmek zere eskiden beri kulland bir
yntemdir. Byke bir problemin tamamn zihinde canlandrp zmeye
almak yerine, oluturulacak model ya da modeller zerinde hedef
sistemin grn, davran ya da baz durumlarda verdii tepkiler
gzlemlenebilir.
Model, var olan ya da gerekletirilmesi planlanan bir sistemi anlamak ya
da anlatmak zere oluturulabilir ve birok farkl alanda etkili bir ekilde
kullanlmaktadr. rnein, bir toplu konut inaatn mterilerine tantmak
isteyen bir inaat firmas, binalarn yerleimlerini, renk ve greli
byklklerini grsel olarak ifade eden maket ya da maketler hazrlar. Bu
maketi inceleyen bir kimse, almak istedii konutun nerede olduunu, okul
binasna yaknln ya da anayola ulamn nasl olduunu grerek
deerlendirebilir. Burada model makettir ve hedef sistemi anlatmak
amacn yerine getirmektedir.
Modelin mutlaka elle tutulur olmas da gerekmez. Bilgisayar benzetimi ile
de eitli modeller oluturulabilir. rnein bir uan havadaki hareketini
incelemek zere gelitirilmi bir bilgisayar benzetimi ile uak
modellenebilir. Kanat uzunluu ya da gvde eimi gibi parametrelerle
oynanarak uan farkl hava koullarnda nasl davranaca anlalmaya
allabilir. Burada, sistemin davrann anlamak amacyla, sanal ortamda
oluturulmu bir model sz konusudur.
Bir sistemle ilgili birden ok model oluturulabilir. Tek bir model ile
sistemin tamamn grmeye almak yerine, zerinde allan sistemin
farkl ynlerini ne karan modeller hazrlanabilir. rnein inaat firmas
toplu konutu mterilere anlatmak zere estetik tasarm n plana kan
bir maket hazrlarken, bu toplu konut projesindeki binalarn elektrik
tesisat iin farkl, su tesisat iin farkl, genel daire grnm iin farkl
projeler hazrlar. Bylece ayn sistemin farkl ynleriyle ilgilenen kimseler,
yalnzca kendilerini ilgilendiren yn ne karan model zerinde alma
olana bulurlar.
1.2 Bilgisayar Programlar ve Modelleme
Bilgisayar programlar, makina ortamna aktarlacak problemin zmn
oluturmak zere gelitirilir. Bilgisayar program yazmak iin ncelikle,
doal dil ile ifade edilen problemin makina ortamnda yeniden
oluturulmas gerekir. ou zaman gelitirilecek program gerek sistemin
tamam ile ilgilenmez. Bu durumda, zerinde allan problem, sistemin
belirli bir adan grnm olarak deerlendirilebilir. Bilgisayar ortamna
bu grnm aktarabilmek iin bir model oluturulmas gerekir.
Oluturulan model gerek hayattakine ne kadar benzer ya da yaknsa,
programlamann o kadar kolaylaaca dnlr. nk programc da bir
insandr ve her ne kadar programlama yaklamlarna hakim ve bu
dorultuda dnmeyi renmi olsa da iinde yaad dnyay olduu
gibi alglamak, zerinde alt problemi baka insanlarn grd gibi
grmek onun iin de en doal olandr.
1.3 Nesneye Ynelik Modelleme
Nesneye ynelik programlama yaklam, gerek hayattan alnm
problemi zmek zere oluturulacak modelin, gene gerek hayatta var
olan nesneler ve bu nesneler arasndaki ilikilerden faydalanlarak
oluturulmasn ilke edinmitir. Problem aynen gerek hayatta grld
ekli ile sanal ortama aktarlabilirse, gnlk yaamnda nesneler ve
nesneler aras ilikiler ile etkileimde olan programc, nesneye ynelik
model sayesinde, zerinde alt problemi aynen gerek hayatta olduu
ekliyle grebilecektir.
Peki nesneye ynelik model nasl oluturulur? Problem gerek hayattakine
benzer ekilde nasl modellenebilir? Bu sorulara birlikte yant arayalm.
1.3.1 Snf ve Nesne Kavramlar
Bir otomobil dnelim. Otomobilin marka ve modeli ne olursa olsun, gaza
basnca hzlandn, frene basnca yavaladn, direksiyonu herhangi bir
tarafa evirince otomobilin o tarafa dndn hepimiz biliyoruz. Bunlar
otomobillerin genel davranlardr ve btn otomobiller bu davranlar
sergiler.
Ayrca, her otomobilin bir motoru, lastikleri, farlar, direksiyonu, dikiz
aynas vardr. Marka ve modeli ne olursa olsun, gene btn otomobillerde
bunlar ve daha birok baka aksam bulunmaktadr. Baka bir deyile,
btn otomobiller bu zellikleri tamaktadr.
Bu rnekte otomobil bir snftr. Otomobil denilince aklmza gelen temel
davranlar ve zellikler, btn otomobillerde vardr. Her otomobil gaza
basldnda ayn srede 100 km hza ulaamyor olsa da, gaza
basldnda btn otomobiller hzlanr. Ya da btn otomobillerin lastikleri
ayn byklkte olmasa da, btn otomobillerin lastikleri vardr. Snf, ayn
zellik ve davranlar sergileyen varlklarn ortak kmesini belirleyen
tanmdr. Hi otomobil grmemi birisine otomobilin ne olduunu
anlatmaya kalksak, kapmzn nnde duran belirli bir otomobili deil, o
kiinin bir otomobil grdnde tanmasn salayacak, btn otomobiller
iin ortak olan bilgiyi aktarmaya alrz.
Baka bir rnek verelim; kalem. Kalem dediimizde hepimizin aklna
bireyler gelir. Yaz yazmak zere kullanyoruz, eitli renk, boy, tip, u
kalnl ve fiyatlarda olabilir.. vs. Kalem deyince, hepimizin tand,
bildii bireyden bahsetiimiz iin hepimiz kafamzda bireyler
canlandryoruz. Ancak ok byk olaslkla herkesin aklnda canlanan
resim birbirinden farkl; kimimiz kurun kalem, kimimiz dolmakalem,
kimimiz tahta kalemi dnyoruz ve belki kurun kalemlerin ounun tipi
birbirinden farkl. Ama sonuta btn kalemlerin yaz yazma davran ve
renk ya da u kalnl zellii var ve bunlar kalem snfn belirleyen
noktalar.
zetle snf, o snftan olan btn varlklarn ortak zellik ve davranlarn
anlatan bir tanmdr.
Nesne ise ait olduu snftan gelen zelliklerin deerlerinin belli olduu,
snf iin tanml olan davranlar nasl sergilediinin bilindii, somut
olarak var olan, biricik bir kimlii olan varlktr. rnein, otomobil snfna
ait olan 06-XYZ-1234 plakal bir otomobil nesnesinden bahsediyorsak, sz
konusu nesnenin kimlii plaka numarasdr ve genel olarak otomobillerden
deil, markas, modeli, rengi belli olan, gaza basldnda 100 km/saat hza
ka saniyede ulat bilinen, elle gsterilebilen tek bir varlktan sz
ediyoruz demektir.
Ayn snfa ait birok nesne olabilir, u an Ankarada binlerce otomobil
bulunduu gibi. Ayn snfa ait olan nesnelerin hepsinde, o snftan gelen
zellik ve davranlar bulunmaktadr. Ancak herbir nesne iin bu
zelliklerin deerleri farkl, davranlarn gerekletirilii de bu zelliklere
bal olarak farkl olabilir. rnein, 06-ZBC-9876 plakal krmz spor
otomobil 100 km/saat hza 6 saniyede ularken, 06-XYZ-1234 plakal
mavi otomobil 100 km/saat hza 12 saniyede ulayor olabilir. Ya da spor
otomobilimiz 100 kmlik yolda 10 lt benzin tketirken, dier otomobilimiz
ayn mesafede 6,5 lt benzin tketiyor olabilir. Burada nemli olan, her iki
otomobilin de otomobil snfndan gelen zellik ve davranlar kendilerine
zg bir biimde sergiliyor olmalardr.
1.4 Nesneye Ynelik Programlama
Nesneye ynelik programlama, nesnelerin birbirlerine ileti gndermeleri
ilkesine dayanr. Bir nesne, baka bir nesneye bir ileti (message)
gndererek, o nesneden bir davran (behaviour) sergilemesini ister.
letiyi alan nesne, bu iletiye gre davrann gerekletirir ve kendi
durum (state) bilgisini deitirir.
Bunu bir rnekle aklamaya alalm:
Bir otomobil, otomobilin srcs ve otomobilin dndaki bir yaya
dnelim. Burada tane nesnemiz var; OTOMOBL, SRC ve YAYA
nesneleri. Otomobilin gazaBasld davran ile hz ve motorHacmi
zellikleri var. Ayrca, otomobilin hznYaz davran da, bu davran
sergilendii anda hz zelliinin deerini ekrana yazyor. Src ve yaya
nesnelerinin zellik ve davranlar ile ise u anda ilgilenmiyoruz.
ekil 2.1de, bu nesneler grlyor.

ekil 1-1. Nesneye Ynelik Programlama
lk olarak SRC nesnesi, OTOMOBL nesnesine bir ileti gndererek
gazaBasildi davrannda bulunmasn istiyor. Bunun zerine, OTOMOBL
nesnesi, hz zelliinin deerini motorHacmi zelliinin deerine bal
olarak deitiriyor (hzlanyor). Yani OTOMOBL, davran
gerekletirerek durumunu deitiriyor. Bu ilem bittikten sonra,
YAYA nesnesi, OTOMOBL nesnesine yeni bir ileti gndererek hznYaz
davrannda bulunmasn istiyor. hznYaz davran, OTOMOBL
nesnesinin yeni hzn (hz zelliinin deerini) ekrana yazyor.
Eer bu nesneleri, zellikleri ve davranlar daha ayrntl bir ekilde ele
alrsak; rnein OTOMOBL nesnesinin hznYaz davrann ekrana yaz
olarak deil de srekli yenilenen bir resim olarak getirmeyi baarabilirsek;
bir otomobil yar oyunu programlayabiliriz.
1.5 Nesneye Ynelik zmleme ve Tasarm
zmleme, hedef sistemin ne yapmas gerektiinin belirlendii
aamadr. Bu aamada alan insann bilgisayar programlama bilgisinin
olmas gerekmez. nemli olan, zerinde alt sistemi tanyabilmek, dile
getirilen gereksinimleri iyi anlayp bu gereksinimlerin arkasnda kalan ve
dile getiril(e)meyen gereksinimleri de bulup kartmak, iin kurallarn ve
ileyiini irdeyebilmektir.
Nesneye ynelik zmleme, zmlemeyi yaparken snflar ve
nesnelerden faydalanr. Sistemdeki snflarn, bu snflarn zellik ve
davranlarnn ne olmas gerektiinin belirlenmesi ile urar.
Tasarm ise hedef sistemin nasl gerekletirilecei sorusuna yant arar.
Tasarm aamas modelin ortaya kt aamadr. Model tasarma bal
kalnarak oluturulur ve zmleme aamasnda belirlenen gereksinimlerin
karlanp karlanmad model zerinde snanabilir.
Nesneye ynelik tasarm, modeli oluturmak zere snflar ve nesnelerden
faydalanr. Snflar aras ilikiler ayrntl olarak incelenir, gereksinimleri
karlamak zere ilikiler, zellikler ve davranlar ekillendirilir. Tasarm
sona erdiinde, ortaya nesneye ynelik bir model kar. Nesneye ynelik
modelin ifade edilmesi iin bir takm grsel diller kullanlmaktadr.
Bunlardan en bilineni ve artk bir standart haline gelmi olan dil, Unified
Modelling Language (UML) ad ile bilinir. Tasarm aamas genelde hedef
sistemin eitli alardan grnlerini ifade eden UML belgeleri ile son
bulur.
1.6 Nesneye Ynelik Programlama Dilleri
Nesneye ynelik model ortaya ktktan sonra, bu modelden nesneye
ynelik programa gemek modeli oluturmaktan daha kolaydr. nk
programlama aamas, modelin bir programlama dili ile ifade edilmesi
aamasdr ve modeldeki hereyin programlama dilinde neye karlk
geldii bellidir. Seilen herhangi bir nesneye ynelik programlama dili ile o
model (modeldeki baz alt dzey ayrntlar dnda) kodlanabilir.
Eer UML gibi bir dil kullanlmsa, oluturulan model bir UML arac ile
izilebilir. ou zaman bu tr aralar, seilen programlama diline gre kod
retebilme (code generation), hatta verilen koddan modele geri dnebilme
(reverse-engineering) yeteneklerine sahiptir.
Demek ki nemli olan hedef sistemin hangi programlama dili ile
gelitirilecei deil, hedef sistem iin gerekli olan modelin
oluturulabilmesidir. Sonraki aamada programalama dili seimi
programlama ekibinin bilgi birikimine, kurumun daha nceki yatrm ve
deneyimlerine ya da sistemin gelitirilmesini isteyen mterinin zel
gereksinimlerine gre yaplabilir.
1.7 zet
Bu blmde, Nesneye Ynelik Programlama ile ilgili eitli kavramlara
ksaca deindik.
Model, hedef sistemin tamamn bir kerede anlamaya almak yerine
ilgilenilen ksmn daha kolay anlayabilmek/anlatabilmek iin ok uzun
zamandr kullanlmaktadr. Modelleme ise modeli oluturma ilemidir.
Bilgisayar programlar, gerek hayattaki problemlerin bilgisayarn doru ve
hzl ilem yapma yeneteinden faydalanlarak zlmesi amacyla
gelitirilirler ve bunun iin ncelikle bilgisayar ortamnda problemin ifade
edilebilmesi gerekir. Bu srete modeller kullanlr.
Nesneye ynelik modelleme, modelleme ileminin nesneler ve nesneler
aras ilikilerin incelenmesi yolu ile yaplmas ilkesine dayanr.
Nesneye ynelik programlama, nesnelerin birbirlerine ileti gndermeleri,
iletiyi alan nesnenin bir davran yerine getirmesi ve davrann yerine
getirilmesi sonucunda durumunun deimesi ile gerekletirilir.
Nesneye ynelik zmleme, sistemde ne yaplmas gerektiinin ve hangi
snf, nesne, zellik ve davranlarn bulunduunun belirlendii aamadr.
Nesneye ynelik tasarm ise snflar aras ilikilerin belirlendii, zellik ve
davranlarn yeniden incelenip son eklini ald, sonucunda nesneye
ynelik modelin ortaya kt aamadr.
Nesneye ynelik programlar, nesneye ynelik modelin herhangi bir
nesneye ynelik programlama dili ile ifade edilmesi sonucunda ortaya
kar. Bir model birok farkl dille ifade edilebilir.
2 Java Platformu
Java yalnzca bir programlama dili deildir. Java Platformunu oluturan
eitli alt geler bulunmaktadr:
Bir programlama dili,
Bu programlama dili ile yazlm programlarn zerinde alaca
altyap,
Farkl alanlarda (masast, cep telefonu, saat, web tabanl...)
uygulama gelitirmek iin kullanlan yardmc ara ve ktphaneler,
Bu ktphanelerin belirtimleri (specification),
Btn bunlarn en iyi baarm elde etmek zere nasl kullanlmalar
gerektiini anlatan en iyi uygulama (best practice) belgelerinin
tamam
Java Platformu, birbirlerinden tamamen bamsz olmayan alt
platform/teknoloji iermektedir;
Java Standart Edition (JSE): Temel Java uygulamalarnn gelitirilmesi iin
gerekli ekirdektir.
Java Enterprise Edition (JEE): Byk lekli, datlm kurumsal
uygulamalarn gelitirilebilmesi iin kullanlr.
Java Micro Edition (JME): Cep telefonu, saat, el bilgisayar gibi kk
lekli ortamlara uygulama gelitirmek iin kullanlr.
Herbir teknoloji kendi iinde birok ktphane, uygulama ats
(framework) ve belge iermektedir. Ancak ncelikle JSE
platform/teknolojisinin renilmesi zorunludur. nk Java
platformlarndan herhangi birisi ile uygulama gelitirebilmek iin ncelikle
Core (ekirdek) Java ad verilen ksm bilinmelidir.
Bu kitabn ilgi alan JEE ya da JME platformlar deildir. Kitap ierisinde
Java Platformu denildiinde, aksi belirtilmedike, JSEden
bahsedilmektedir.
Platform, bir programn alt donanm ya da yazlm ortamdr.
Java platformu, Java programlarnn almas iin gerekli olan iki
bileenden oluur:
1- Java Sanal Makinesi (Java Virtual Machine)
2- Java Uygulama Programlama Arayz (Application Programming
Interface-API)
Platformdan Bamszlk balamnda kullanlacak olan platform szc
ise, donanm ve o donanm zerinde alacak olan iletim sistemini ifade
etmektedir. rnein Windows32 platformu, 32 ikillik Windows iletim
sisteminin alt bir ortam ifade etmektedir.
Platform szcnn kullanld balama gre deerlendirilmesi gereklidir.
2.1 Platformdan Bamszlk
Java ile ilgili konuulurken genelde ilk sylenen Javann platformdan
bamsz bir dil olduudur. Peki platformdan bamszlk ne demektir?
Platformdan bamszln ne olduunu anlatabilmek iin, ncelikle
platforma bamlln ne olduunu aklamaya alalm. zerinde
Windows98 iletim sisteminin almakta olduu bir kiisel bilgisayar
zerinde, Visual Studio 6.0 tmleik gelitirme ortamn (Integrated
Development Environment - IDE) kullanarak C dili ile bir program
gelitirdiimizi dnelim. Program derlendii zaman, altrlabilir
(zerine ift tkladmzda ya da konsolda adn yazdmzda almaya
balayan: executable), .exe uzantl bir dosya (file) oluur. Bu program,
Windows98 iletim sistemi zerinde altrlabilir bir dosya (executable
file) olarak saklanmaktadr.
Bu altrlabilir dosyay, zerinde Linux iletim sistemi alan baka bir
makineye kopyaladmzda programn almadn grrz. nk o
altrlabilir dosya, ancak Windows ortamnda alabilecek ekilde
oluturulmutur. Baka bir deyile, hangi platformda alaca bellidir.
Bunun nedeni, belli bir platform (iletim sistemi + donanm) zerinde
almak zere oluturulmu altrlabilir dosya iinde saklanan bilgilerin
o platforma zel olarak retilmi olmasdr.
Bir C programnn geirdii aamalar ekil 4-1de grlmektedir.

ekil 2-1. C Programlarnn Geirdii Aamalar
C programlar platforma zel olduklarndan, ayn C programnn baka bir
platformda altrlabilmesi, C programnn o platform iin yeniden
derlenmesini ve altrlabilir dosyaya dntrlmesini gerektirir.
Java platformunda ise yaklam farkldr. Programn zerinde alaca
platforma zel kodlar retilerek altrlabilir dosya oluturulmas yerine,
herhangi bir platform zerinde baka bir ara uygulama tarafndan
yorumlanabilecek kodlar retilir. Bu ara uygulama ise Java Sanal
Makinesi (Java Virtual Machine JVM) ad ile bilinir.
Java kaynak kodlar yazlp .java uzants ile kaydedildikten sonra, bir
Java derleyicisi ile derlenir. Derleme sonucunda oluan .class uzantl
dosyaya snf dosyas (class file) ad verilir. Bir snf dosyas, herhangi bir
platforma zel olmayan, herhangi bir JVM tarafndan yorumlanabilecek,
byte-code olarak adlandrlan ikil (binary) bilgiler ierir. rnein
WindowsXP ortamnda yazdmz Java programn Linux ortamna tamak
istediimizde, bu derlenmi snf dosyalarn (.class uzantl dosyalarn)
Linux ortamna kopyalamamz yeterlidir. Linux ortam iin gelitirilmi olan
JVM, zerinde hibir deiiklik yapmadan Linux ortamna aktardmz
dosyalar yorumlayarak altracaktr.
Baka bir deyile, Java dilinin platformdan bamsz olmas, btn yaygn
platformlar iin (Windows, Linux, Unix ya da Apple ortamlar iin) birer
JVMnin gelitirilmi olmas ile salanmtr. JVM, bir belirtime
(specification) uymaktadr ve bu sayede o belirtime uygun olarak
gelitirilmi btn Java programlarn farkl platformlarda ayn ekilde
altrabilmektedir. Ksaca, Java kaynak kodu ile platforma zel makine
kodu arasna bir katman daha eklenmi, derlenmi Java dosyalarnn bu
katmandan alnan hizmet ile altrlmas salanmtr. Bylece
programclarn ii kolaylamakta, gelitirdikleri uygulamalar hi deiiklie
uramadan farkl platformlarda alabilmektedir.
ekil 4-2de bir Java programnn platformdan bamszlnn
salanmasnda JVMnin nasl rol oynad grlmektedir.

ekil 2-2. Java Programlarnn Platformdan Bamszlnda JVMnin Rol
Javann platformdan bamszlnn bu ekilde salanmas, yani java
kaynak dosyalarndan retilen kodlarn (byte-code) JVM gibi bir ara
katman tarafndan iletilmesi, Java programlarnn, hedef platforma zel
retilen zgn kodlarn (native codes) iletilmesi mantna dayanan C gibi
dillerle gelitirilen programlara oranla az da olsa daha yava olmasna
neden olmaktadr. Bu, platformdan bamszlk iin denen bir bedel
olarak grlebilir. Bununla birlikte derleyici ve JVM teknolojilerindeki
ilerlemeler Java programlarnn baarmn platformdan bamszlk
prensibinden dn vermeden zgn kodlarn baarmna yaklatrmaktadr.
Java programlarnn platformdan bamszln vurgulayan slogan:
Write once, run anywhere: Bir kez yaz, heryerde altr
2.2 Java Sanal Makinesi (Java Virtual Machine - JVM)
Java Sanal Makinesinin, Java programlarnn paltformdan bamszln
nasl saladn bir nceki blmde aklamaya altk. Bu blmde ise
JVMnin Java programlarn nasl ilettiini kabaca anlatmaya alacaz.
Hereyden nce unu sylemekte yarar var: birden fazla JVM olabilir ve
bunlarn birbirlerine gre daha iyi ya da daha kt baarmlar
(performance) olabilir. Bunun nedeni basittir. JVM iin bir belirtim
(specification) bulunmaktadr. Bu belirtim, JVM ad verilen yazlmlarn
uymalar gereken kurallar, salamalar gereken kstlar, ksaca bir
yazlmn JVM olarak adlandrlabilmesi iin gerekli hereyi tanmlamaktadr.
Belirtim, ne olmas gerektiini belirleyen ancak nasl olmas gerektii
konusunda bir kst getirmeyen bir belgedir. Dolaysyla, ayn belirtimi
gerekletiren farkl yazlm ekipleri, kendi gerekletirimlerinde
(implementation) kullandklar veri yaplar ya da algoritmalar sayesinde
dierlerinden daha yksek baarml JVMler gelitirebilirler.
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.d
oc.html adresinde JVM belirtimi bulunabilir.
Java Sanal Makinesi, Java programlarn altrmak zere bir takm
grevler iermektedir. Bu grevlerin bazlarna ksaca bakalm:
Snf Ykleyici (Class Loader): Java programlar birbirleriyle etkileimde
bulunan snflardan oluur. Bir snfn nesnesinin oluturulabilmesi iin nce
snfn bellee yklenmesi gerekir. Snf Ykleyici grevi, .class uzantl
dosya iinde bulunan Java snfn bellee ykler.
Byte-kod Dorulayc (Byte-code Verifier): Bellee yklenen byte-
kodlar inceleyerek trlere dair bilgileri oluturur ve btn parametrelerin
trlerini dorular. Ayrca bir takm gvenlik kstlarn denetler.
Yorumlayc (Interpreter): Bellee yklenmi ve dorulanm byte-
kodlar JVMnin zerinde almakta olduu platforma zel kodlara
dntrerek iletir.
ekil 4-3te bu grevlerin almas grlmektedir.

ekil 2-3. JVM indeki Baz Grevler
Java programlarnn altrlmasnda rol alan 3 temel greve baktktan
sonra, biraz da JVMnin yapsna bakalm. Daha sonra anlatacamz
kesimlerde bu yapya gndermeler yapacaz.
Java Sanal Makinesinin, sanal donanm kesimi 4 temel blmden oluur:
yazmalar (registers), yt (stack), yn (heap) ve yntem alan
(method-area). Bu blmler, oluturduklar sanal makine gibi sanal (ya da
soyut) blmlerdir ancak her JVM gerekletiriminde bir ekilde bulunmak
zorundadrlar.
32 ikillik JVM iinde bir bellek adresi 32 ikil (bit binary digit) ile ifade
edilir. Baka bir deyile 32 ikillik JVM, herbiri 1 byte veri ieren 2
32
adet
bellek yerleimini, yani 4GBlik bellei adresleyebilir.
Adresleme hesaplarnn nasl yapldn merak eden okuyucularmz iin
hesaplamay biraz daha aalm:
Adreslemede
kullanlan
ikil says
Bu ikiller ile ifade
edilebilecek farkl deer
says
Bu saynn
ifadesinde
kullanlan
ksaltma
Bu kadar Byte
anlamnda
kullanlan
ksaltma
10 ikil 2
10
= 1024 Kilo KB
20 ikil 2
20
= 2
10
x 2
10
= Kilo x 1024 Mega MB
30 ikil 2
30
= 2
20
x 2
10
= Mega x 1024 Giga GB
32 ikil 2
32
= 4 x 2
30
= 4 x Giga 4 Giga 4GB
Tablo 2-1. Adresleme Hesaplar
32 ikillik JVMnin iindeki her yazma 32-ikil uzunluunda bir adres tutar.
Yt, yn ve yntem alanlar da bu 32-ikil ile ifade edilebilen 4GB
byklndeki bellein bir yerlerinde olmak zorundadr. Ancak neyin
nerede saklanaca, kullanlan JVMye zeldir.
Burada anlatlanlar kabaca u anlama gelmektedir. Kiisel bilgisayarnzda
bir Java program iletmek iin bilgisayarnza kuracanz JVM (sonraki
kesimlerde JVMnin nasl kurulduuna bakacaz), bilgisayarnzn belleinin
en fazla 4 GBlk bir ksmn kullanabilir. Gnmzde satlmakta olan kiisel
bilgisayarlarn genelde 2GB - 4GB bellekleri olduunu dnrsek, bu snrn
ou zaman yeterli olaca sonucunu karabiliriz.

2.3 Java Uygulama Programlama Arayz
(Java Application Programming Interface - API)
Uygulama Programlama Arayz, eitli yetenekler sunan hazr yazlm
bileenlerinden oluan bir derlemdir.
Java API, eitli amalarla kullanlmak zere tasarlanm ok zengin bir
bileen ktphanesi sunar. Java ile uygulama gelitirilirken bu
bileenlerden faydalanlr. rnein, eer dosya ilemleri yapan bir program
yazmak istiyorsak, Java APIde bulunan ve dosyalarla ilgili her trl ilemi
yapmakta kullanlan snf ve arayzleri bilmemiz gerekir. Ya da kolay
kullanml ve zengin bir grafik kullanc arayz (Graphical User Interface -
GUI) olan bir uygulama iin Java Swing APIyi kullanabiliriz.
ekil 3-4te JVM ve Java API birlikte grlmektedir.

ekil 2-4. Java Sanal Makinas, Java API ve Java Program
Java platformunu tandktan ve Java ile nesneye ynelik uygulama
gelitirme yaklamn rendikten sonra, kendisini gelitirmek isteyen bir
kimsenin yapmas gereken i Java APIyi renmek olacaktr. Bileenlerin
tamamnn renilmesi ok olas olmasa da, neler bulunduuna dair fikir
sahibi olmak nemlidir. Bylece herhangi bir programlama gereksinimini
karlamak zere nelerin kulllanlabilecei bilinmi olur ve zme ulamak
kolaylar.
Java APIde neler olduuna dair fikir edinmek iin en kolay yntem
herhalde Java API Documentation ad ile bilinen ve bu kitabn
yazlmakta olduu zamanda http://java.sun.com/javase/6/docs/api/
adresinden eriilebilen HTML belgelerine bir gzatmaktr.
Java API Documentation, www.java.sun.com adresinden indirilebilir. Java ile
uygulama gelitirirken en sk bavurulacak belge olduundan, bu belgeyi
bilgisayarnza indirmenizde fayda vardr.
ekil 3-5te Java API Documentation belgelerinden rnek bir grnm
bulunmaktadr. Grld gibi sayfa 3 ereveden olumaktadr. Sol st
taraftaki erevede APIde bulunan paketler (packages), sol alt erevede
seilen pakette bulunan snf ve arayzler, sa taraftaki byk erevede
ise sol alt ereveden seilen snf ya da arayz ile ilgili aklamalar ve o
snf ya da arayzn yntemleri ile bunlara ait ayrntl bilgiler
bulunmaktadr.

ekil 2-5. Java API Documentation Belgelerinden rnek Bir Grnm
Belgenin kullanln bir rnekle aklamaya alalm. Diyelim ki dosya
ilemlerine gereksinim duyduumuz bir uygulama gelitiriyoruz. Diskteki
bir dosyay ap iindeki veriler zerinde ilem yapmamz gerekiyor.
Bununla ilgili olarak ne kullanabileceimiz hakknda az da olsa fikrimiz var
ancak neyi nasl kullanacamz tam olarak bilmiyoruz.
Bu durumda, Java API Documentation belgelerine bavuruyoruz. Sol st
ereveden java.io paketini seiyoruz. Bu paket, Javada giri/k
(input/output) ilemlerinin yaplabilmesi iin kullanlabilecek snf ve
arayzleri iermektedir. Sol alt ereveye, paketin iindeki snf ve
arayzlerin listesi gelir. File snfnn zerine tkladmzda, sadaki
erevede File snfna ait bilgiler gelir. Snfla ilgili genel aklamalar
okuduktan sonra, alt tarafta bu snfn iinde bulunan yntemlerin listesini
inceleyebilir ve rnein program ierisinden bir dosyann adn deitirmek
iin renameTo adl bir yntemin kullanlacan grebiliriz.
ekil 4-6da bu admlar grlmektedir.

ekil 2-6. Dosya lemleri in File Snfnn ncelenmesi

2.4 zet
Java yalnzca bir programlama dili deil, bu dil ile yazlm programlarn
zerinde altrld bir platformdur.
Java programlarnn platformdan bamszlklar, farkl platformlar iin
gelitirilmi olan Java Sanal Makineleri ile salanmaktadr.
Java Sanal Makinesi, belli bir belirtime uygun olarak gerekletirilmi bir
yazlmdr. Sanal bir donanm ynetir ve (32 ikillik) sanal donanm en
fazla 4GB bellek kullanabilmektedir.
Java platformu, Java Sanal Makinesi ile Java Uygulama Programlama
Arayznden oluur. Uygulama Programlama Arayz, hazr yazlm
bileenlerinin bir derlemidir.
Java Uygulama Programlama Arayz, Java uygulamalarnda
kullanlabilecek snf ve arayz tanmlarn ierir. Bunlarla ilgili bilgi, Java
API Belgelerinden edinilebilir.



3 Java Dili le lgili Temel Bilgiler
Bu blmde, Java dili ile ilgili temel bilgilere yer verilecektir. Okuyucunun
temel programlama bilgisi olduu kabul edilecek ve deiken nedir?,
dng nedir?... gibi konular anlatlmayacak, yalnzca bu tip temel
yaplarn Javada nasl ifade edildiklerine hzlca baklacaktr.
Java dili szdizimsel olarak C, C++, C# dillerine ok benzer. leler,
ilelerin ncelikleri, deiken tanmlama ve ilk deer atama, denetim ve
dng yaplar byk oranda ayndr. Eer bu dillerden herhangi birisini
biliyorsanz, bu kesime ksaca bir gzatp hzlca geebilirsiniz.
3.1 Szdizim Kurallar (Syntax Rules)
Her programlama dilinde olduu gibi Javada da bir takm szdizim
kurallar vardr. Szdizim kurallarna uygunluu derleyici denetler ve
kurallara uymayan durumlar raporlar. Dolaysyla szdizim kurallarn tek
tek aklamaya almak yerinde bir aba olmayacaktr.
C, C++ ya da C# bilen okuyucular iin Javadaki szdizim kurallarnn bu
dillerdekilerle hemen hemen ayn olduunu syleyebiliriz.
3.1.1 Derleyiciler
Derleyiciler, kaynak kodu inceleyerek bu kodun programlama dilinin
szdizim kurallarna uygun olarak yazlp yazlmadn denetleyen, eer
dilin kurallarna uygun olmayan durumlar belirlenirse bunlar raporlayarak
programcya kodu dzeltmesi iin ipular veren programlardr.
3.1.2 Whitespace karakterleri
Kod yazlrken kullanlan baz karakterler whitespace karakterleri olarak
adlandrlr ve derleyici tarafndan dikkate alnmaz:
end-of-line karakteri: \n ile ifade edilir; kod yazlrken Enter tuuna her
baslta, imlecin bulunduu yere bir end-of-line karakteri koyulur ve
kullanlan metin dzenleyici bu karakteri yorumlayarak imleci bir satr
aaya indirip satr bana gtrr.
form-feed karakteri: \f ile ifade edilir ve imleci sonraki sayfann bana
gtrr.
boluk karakteri: boluk ubuuna (space-bar) basld zaman oluan
karakter, metin dzenleyici tarafndan imlecin bir karakterlik bo yer
braklarak ilerlemesini salar
tab karakteri: \t ile ifade edilir, allan metin dzenleyicide genellikle 4
ya da 8 boluk karakterine karlk gelecek ekilde ayarlanabilir
whitespace karakterlerinin derleyici tarafndan dikkate alnmamas u
anlama gelmektedir: programc kodlama yaparken deyimler ya da
deikenler arasnda istedii kadar boluk brakabilir, satr atlayabilir ya da
tab tuu ile ilerleyebilir, ancak szdizim kurallarna aykr bir i yapm
olmaz. Bununla birlikte, whitespace karakterleri kodun daha okunur
grnmesini salamak amacyla kullanlr.
3.2 Aklama Satrlar (Comment Lines)
Aklama satrlar, kod ii belgeleme amacyla kullanlan ve derleyici
tarafndan dikkate alnmayan kod kesimleridir. Bir programcnn aklama
satr yazmak iin temel iki amac olabilir:
Yazd kodun kritik kesimlerini aklayarak, o koda daha sonra bakan
kimselerin (byk olaslkla kendisinin) iini kolaylatrmak: Aslnda bu
ekilde aklama gerektiren kod, baarl bir kod deildir. nk zaten
yazlan kodun hibir aklamaya ihtiya duyulmadan kendisini
aklayabilmesi gerekir.
Yazd kod ile ilgili belge oluturmak: Yazlmlarn belgelenmesi bir
gerekliliktir. Bu belgeleme gereksinimi bazen srf mteri istiyor diye
yerine getiriliyor olsa da, ou zaman ortaya kan rnn yaatlabilmesi
ve hatta gelitirilebilmesi iin gerekletirilmektedir. Belgeler, gereksinim
belirleme ve tasarm srelerinde raporlar eklinde oluturulurken,
kodlama srecinde kod ii belgeleme olarak ortaya kar.
Javada aklama satrlar 3 farkl ekilde yazlr:
3.2.1 // ile yaplan aklamalar
Tek satrlk bir aklama yaplacaksa o satrn bana // iareti yazlr. Bir
sonraki satra geilene kadar bu satra yazlan herey aklama olarak
deerlendirilir ve derleyici tarafndan dikkate alnmaz. Daha doru bir
ifade ile; // iaretinden sonra satr sonuna kadar herey aklamadr.
Anlalaca zere bu iaretin satrn en banda olmas zorunlu deildir.
Ancak kodlama alkanl bakmndan satr banda kullanlmas daha
uygundur.
rnek:

// bu bir aklama satrdr
int sayi = 5; // sayi deikenine 5 deeri atand.

Kod 3-1. Tek satra yazlan aklamalar
3.2.2 /* ... */ ile yaplan aklamalar
Eer birden fazla satrda yazlan bir aklama varsa, her satrn bana //
iareti koymak programcya zor gelebilir. Bunun yerine, aklama olarak
deerlendirilmesi istenen satrlar /* ve */ iaretleri arasna alnr. Bu iki
iaret arasnda kalan kesimler derleyici tarafndan aklama satr olarak
kabul edilir.
rnek:

/* Bu birden fazla satrdan oluan bir aklamadr. Ancak bir aklamann
bu yolla ifade edilmesi iin birden fazla satrdan olumas zorunluluu
yoktur. */
int sayi = 5; /* sayi deikenine 5 deeri atand. */

Kod 3-2. Birden fazla satra yazlan aklamalar
3.2.3 /** ... */ ile yaplan aklamalar
Bir uygulama gelitirilirken kod ii belgeleme yapmak gzel bir
programlama alkanldr. nk hem yapmakta olduunuz ii en gzel o
ii yaparken aklayabilirsiniz, hem de aklayabildiiniz kodu anlamsnz
demektir ve o kodu aklayarak yazdnz iin hata yapma olaslnz
der.
te yandan, ou zaman uygulamalarn raporlarnn oluturulmas gerekir.
Kod yazldktan sonra kodun iine yazlan aklamalardan bir belge
oluturarak bu belgeyi raporun sonuna eklemek programcnn ykn
hafifletecektir. te imdi bahsedeceimiz nc yntem bu amala
kullanlr. /** ve */ iaretleri arasna yazlan aklamalar bir takm zel
etiketler ierebilir. Kod ii belgeleme, bu etiketleri tanyan ve etiketlerden
faydalanarak belge reten bir aracn yardm ile belgeye
dntrlebilmektedir.
Bu tarzda yazlan aklama satrlarna Javadoc ad verilmektedir. Javadoc
iin kullanlabilecek baz imler ve ne iin kullanlabilecekleri aada
listelenmitir:
Etiket Aklama
@author Kodu yazan kiinin kim olduunu belirtir
@deprecated Yntemin artk kullanmda olmadn belirtir. Baz
uygulama gelitirme ortamlar, bu ekilde iaretlenmi
yntemler kullanldnda programcy uyarr.
@exception Bir yntemin frlatt aykr durumu belirtir
@param Yntemin ald parametreleri aklamakta kullanlr
@return Yntemden dnen deeri aklamakta kullanlr
@see Baka bir yntem ya da snf ile balant kurar
@since Bir yntemin ne zamandan beri var olduunu belirtir
@throws Bir yntemin frlatt aykr durumu belirtir.
@version Bir snf ya da yntem iin srm numaras belirtir.
Tablo 3-1. javadoc iin kullanlan imlerden bazlar ve aklamalar
javadoc.exe arac, JDKnn kurulduu klasrde bin klasrnn altndadr.
Bu ara, Java kaynak kodlarnn zerinden geerek /** .. */ iaretleri
arasna yazlan aklama satrlarndan belge retir. Belge, Java API
Belgeleri ile ilgili kesimde anlatld gibi HTML dili ile oluturulmaktadr.
Aslnda Java API Belgesinin kendisi de bu yolla oluturulmu bir belgedir
ve belki de Java APIsini kullanmak ve renmek zere kullanlabilecek en
iyi ve kolay kullanml belgedir.
rnek:

package ornek;
/**
* @author Ouz Aslantrk - 06.Mar.2007
*
*/
public class AciklamaSatiriOrnegi {

/**
* Verilen saynn karekkn bularak dndrr.
* Saynn sfrdan kk olmadn varsayar.
*
* @param sayi Karekk alnacak say
* @return Saynn karekk
*/
public double karekok(double sayi) {
double kkok = 0;
// burada karekk bulma algoritmasnn altn kabul edelim
return kkok;
}
}

Kod 3-3. javadoc ile yaplan aklamalar
Konsolda AciklamaSatiriOrnegi.java dosyasnn bulunduu klasre
gidip aadaki satr yazarsak, Docs adl bir klasr oluturulacak ve ad
verilen .java dosyas iin HTML belgeleri oluturulacaktr.

javadoc d Docs AciklamaSatiriOrnegi.java
Kod 3-4. Javadoc ile belge oluturma
Aada bu belgeye ait bir grnm bulunmaktadr:

Kod 3-5. Aklama satrlarndan oluturulan javadoc belgesi
3.3 Temel Trler (Primitive Types)
Javada temel trler tabloda grld kadardr. Herbir temel trn
uzunluunun ve alabilecei en byk ve en kk deerlerin belli olmas
programclarn iini kolaylatrmaktadr.
Tr kil
says
En kk deer En byk deer Varsaylan
deer
byte 8 -2
7
2
7
-1 0
short 16 -2
15
2
15
-1 0
int 32 -2
31
2
31
-1 0
long 64 -2
63
2
63
-1 0
float 32 -3.4 x 10
38
, 7 hane 3.4 x 10
38
, 7 hane 0.0
double 64 -1.7 x 10
308
, 15 hane 1.7 x 10
308
, 15 hane 0.0
char 16 - - Boluk
krakteri
boolean 0 false true false
Nesne
referans
32 - - null
Tablo 3-2. Javada Temel Trler
Temel trlerin varsaylan deerleri grld gibi belirlidir. Yine de
deikenler tanmlanrken ilk deer olarak bu deerlerin atanmas kodun
okunurluunu arttran ve olas hatalarn nne geen iyi bir programlama
alkanldr.
3.4 Deiken Tanmlama ve lk Deer Atama (Variable
Declaration and Initialization)
Deiken, veri saklamak iin kullanlan bellek alanlarna verilen addr. Her
deikenin ad, adresi, tr ve deeri vardr. Deiken tanm aadaki
ekilde yaplr:
deikenin_tr deikenin_ad;
Ayn trden birden fazla deiken tanmlanacaksa, bunlar , iareti ile
ayrlarak yazlabilirler.
deikenin_tr deikenin_ad_1, deikenin_ad_2;
Aada baz deiken tanmlar grlmektedir:
short sayi;
int sayi1, sayi2;
double gercelSayi1,
gercelSayi2;
Kod 3-6. Deiken tanmlama
Bir deikene ilk deer atamak iin, deiken tanmnn hemen yannda
atama ileci kullanlabilir:
byte byteTipindeDegisken = -8;
char birinciKarakter = a, ikinciKarakter = z;
float gercelSayi = 4.35;
Kod 3-7. Deikene ilk deer verme
Javada bir takm isimlendirme kurallar/gelenekleri (Naming Conventions)
bulunmaktadr. Bu kurallara gre deiken adlar kk harfle balar, birden
fazla szckten oluuyorsa, birinci szckten sonraki szcklerin yalnzca ilk
harfleri byk dierleri kk yazlr: byteTipindeDegisken, birinciKarakter
deikenlerinde olduu gibi.

Bir deiken tanmlarken, deiken adnn zenle seilmesi ve deikenin
yapaca ii belirtmesi gzel bir programlama alkanldr.
3.4.1 Deikenin Tanm Alan (Scope)
ki kme parantezi ({ ve }) arasnda kalan kod kesimine blok denir.
{ iareti bir kod blou balatr ve } iareti balatlan kod blounu bitirir.
Herhangi bir deiken, tanmland kod blou iinde fiziksel olarak vardr
ve o kod blou iine yazlan kod kesimlerinden eriilebilirdir. Bu alana
deikenin tanm alan denir.
Bir blok iinde ayn deiken ad birden fazla kez kullanlamaz.
rnek:
int n = 5;
System.out.println("n: " + n); // n: 5
{
int k = 3;
System.out.println("k: " + k); // k: 3
n = 8;
} // k buraya kadar tanml, buradan sonra eriilemez
System.out.println("n: " + n); // n: 8
Kod 3-8. Kod blou ve tanm alan rnei
3.5 leler (Operators)
3.5.1 Aritmetik ileler:
le Ad Gsterimi rnek
Atama (assignment) = a = 5;
Toplama + a = a + b;
karma - a = a b;
arpma * a = a * b;
Blme / a = a / b;
Mod Alma % a = a % 3;
Tablo 3-3. Aritmetik ileler

3.5.2 Birleik Aritmetik leler:
le Ad Gsterimi rnek
Toplama ve atama += a += b; // a = a + b;
karma ve atama -= a -= b; // a = a - b;
arpma ve atama *= a *= b; // a = a * b;
Blme ve atama /= a /= b; // a = a / b;
Mod alma ve atama %= a %= b; // a = a % b;
Tablo 3-4. Birleik Aritmetik leler

3.5.3 Arttrma ve Azaltma leleri:
le Gsterimi rnek
Arttrma (increment) ++ a++; // post-increment
++a; // pre-increment
Azaltma (decrement) -- a--; // post-decrement
--a; // pre-decrement
Tablo 3-5. Arttrma ve Azaltma leleri
Arttrma ve azaltma ileleri deikenin nne veya sonuna yazlabilir.
Nereye yazldklarna bal olarak ilelerin nasl iletilecei deiir:
Deikenin sonuna yazlrsa:

int a = 3, b = 5, c;
c = a++ + b;
System.out.println(a: + a); // a: 4
System.out.println(b: + b); // b: 5
System.out.println(c: + c); // c: 8

Kod 3-9 Arttrma ilecinin deikenin sonuna yazlmas rnei
Deikenin nne yazlrsa:

int a = 3, b = 5, c;
c = ++a + b;
System.out.println(a: + a); // a: 4
System.out.println(b: + b); // b: 5
System.out.println(c: + c); // c: 9

Kod 3-10 Arttrma ilecinin deikenin nne yazlmas rnei
rneklerde de grld gibi, her iki kod kesiminde de ann deeri
arttrma ileci ile 1 artmaktadr. Ancak ilk rnekte, ann deeri
arttrlmadan nce (ann deeri 3 iken) aktarma ilecinin sa tarafndaki
ilem gerekletirilmekte ve buna bal olarak cnin deeri 8 olmakta;
ikinci rnekte ise ann deeri 1 arttrldktan sonra sa taraftaki ilem
gerekletirilmekte ve buna bal olarak cnin deeri 9 olmaktadr. Baka
bir deyile, her durumda ann deeri arttrma ileci ile 1 arttrlacaktr
ancak bunun nce mi sonra m olacana gre cnin deeri deimektedir.
Eer bu iletim kafanz kartrdysa, ++a ya da a++ yerine bir nceki ya da
bir sonraki satra a += 1 yazarak kodun nasl altndan emin
olabilirsiniz. Programlama dilindeki her ayrnty kullanmanz gerekmez,
nemli olan doru, etkin ve okunur kod yazmaktr.
3.5.4 likisel (relational) ileler:
le Ad Gsterimi rnek
Eittir == a == b
Eit deildir != a != b
Byktr > a > b
Kktr < a < b
Byk ya da eittir >= a >= b
Kk ya da eittir <= a <= b
Tablo 3-6. likisel leler
likisel ileler, mantksal ifadelerde kullanlr. Bir karlatrma sonucu
elde edilen deer mantksal doru (true) ya da mantksal yanl (false)
olabilir.
C ve C++ dillerinde, 0 (sfr)dan farkl deerler mantksal doru, 0 deeri ise
mantksal yanl olarak deerlendirilir. Ancak Javada mantksal doru ve
yanl ifade etmek zere boolean temel tr bulunmaktadr ve herhangi bir
saysal deer doru ya da yanl olarak deerlendirilemez. Bu nedenle,
saysal deerlere bal olarak kurulan ilikisel ifadelerde ilikisel ile
kullanlmas zorunludur; C ya da C++da olduu gibi sadece deikenin
deerine gre karar verilemez.

likisel ileciler ile ilgili olarak en yaygn yaplan hata, eittir ileci (==)
yerine yanllkla atama ileci (=) yazmaktr. Kodlarnzda buna dikkat
ediniz.
3.5.5 Mantksal leler:
le ad Gsterimi rnek
ve (and) && a > 0 && a < 10
ya da (or) || a < 0 || a > 10
deil (not) ! !(a > 0)
Tablo 3-7. Mantksal leler
3.5.6 lelerin ncelikleri:
Verdiimiz ilelerle ilgili ncelik kurallarn basit ifadelerle aklayalm.
Tekil ilelerin ikili ilelere gre ncelii vardr.
Aritmetik ilelerde arpma ve blme ilelerinin toplama ve karma
ilelerine gre ncelii vardr. Ayn ncelikli ileler soldan saa
srayla iletilir.
Aritmetik ileler ilikisel ilelere gre nceliklidir.
likisel ileler soldan saa srayla iletilir.
likisel ileler mantksal ilelere gre nceliklidir.
En dk ncelikli ile atama ilecidir.
Yukardaki kurallara gre aadaki kod kesimini iletelim:
int a = 3, b = 5, c;
c = a * ++b / 5 - 12 * a + b;
System.out.println("c: " + c); // c: -27

boolean bool = a + b < a * c && a + b >= b + a;
System.out.println("bool: " + bool); // bool: false
Kod 3-11. le ncelikleri rnei
ncelikler parantez kullanlarak deitirilebilir. Bir ifade, baz ksmlar
parantezler arasna alnarak dzenlendiinde nce parantezlerin ii iletilir.
Kod 3-10da grlen kod kesimini, ncelikleri parantezlerle belirleyecek
ekilde yeniden yazp iletelim:
int a = 3, b = 5, c;
c = (a * ++b) / (5 - 12) * (a + b);
System.out.println("c: " + c); // c: -18

boolean bool = (a + b) < (a * c) && (a + b) >= (b + a);
System.out.println("bool: " + bool); // bool: false
Kod 3-12. Parantezler ile ncelik belirleme rnei
Grld gibi c deikeninin deerinin hesapland satrda ncelikleri
deitirerek farkl bir deer bulunmasn saladk.
bool deikeninin deerinin belirlendii satrda ise ncelikleri
deitirmedik. Ancak kodun daha kolay okunabilir olmasn saladk.
ncelik kurallar bilinse de karmak bir deyimin okunabilirlii ou zaman
olduka dktr. Parantez, ncelikleri deitirmek zere kullanlabildii
gibi, bazen srf kodun okunabilirliini arttrmak iin kullanlr.
Kodun okunurluunu arttrmak iin parantezleri kullanmak gzel bir
programlama alkanldr.
Bu blmde listelenen ileler, Java dilindeki btn ileler deildir. Ancak
vereceimiz temel bilgiler asndan bu ileler yeterlidir. lelerle ilgili
daha ayrntl bilgi iin Java referans belgelerine bavurabilirsiniz.
3.6 Denetim Deyimleri (Control Statements)
Denetim deyimleri, bir takm koullara gre programn aknn
belirlenmesini salayan programlama geleridir. Bir denetim deyimi,
iletilecek bir sonraki koulun hangisi olacan belirlemek zere bir koulu
denetler.
3.6.1 if else deyimi
u ekilde yazlr:
if (koul ifadesi) {
koulun doru olmas durumunda iletilecek kod kesimi
}
else {
koulun doru olmamas durumunda iletilecek kod kesimi
}
if ve else deyimleri ayrlm szcklerdir. if deyiminin denetlemesi
istenen koul ifadesi parantez iinde yazlmak zorundadr. Koul ifadesini
izleyen kme parantezi ( { ), if blounun balangcdr. Bu parantez
kapatlana ( } ) kadarki kod kesimi, koulun doru olmas durumunda
iletilecek kesimdir. if blou kapatldktan hemen sonra else deyimi gelir
ve else blou balar. else blou, koulun doru olmamas durumunda
iletilir. Ksaca, koula bal olarak ya if blou ya da else blou
iletilecektir. if ve else bloklarnn arasna herhangi bir deyim giremez.
rnek:
int a = 3, b = 5;
System.out.println("Denetimden nceki kod kesimi");
if (a > b) {
System.out.println("a, b'den byktr.");
}
else {
System.out.println("a, b'den byk deildir.");
}
System.out.println("Denetimden sonraki kod kesimi");
Kod 3-13. if deyimi rnei - 1
kt:
Denetimden nceki kod kesimi
a, b'den byk deildir.
Denetimden sonraki kod kesimi
else blounun yazlmas zorunlu deildir, ancak if blou olmadan else
blou yazlamaz. Baka bir deyile, elsesiz if olabilir ancak tersi doru
deildir. Bazen yalnzca koulun doru olmas durumunda iletmek
istediimiz bir kod kesimi vardr ancak yanl olmas durumunda iletilecek
zel bir kod yoktur. Bu durumda yalnzca if blounu yazmak yeterlidir.
rnek:
int a = 3, b = 5;
System.out.println("Denetimden nceki kod kesimi");
if (a > b) {
System.out.println("a, b'den byktr.");
}
System.out.println("Denetimden sonraki kod kesimi");
Kod 3-14. if blou rnei - 2
kt:
Denetimden nceki kod kesimi
Denetimden sonraki kod kesimi
Eer if ya da else bloklarndan herhangi birisi tek satrdan oluuyorsa,
{ } arasna alnmayabilir. if deyiminden hemen sonra gelen ilk satr if
deyimine, else deyiminden sonra gelen ilk satr da ayn ekilde else
deyimine bal olarak iletilir.
rnek:
int a = 3, b = 5;
System.out.println("Denetimden nceki kod kesimi");
if (a > b)
System.out.println("a, b'den byktr.");
else
System.out.println("a, b'den byk deildir.");
System.out.println("Denetimden sonraki kod kesimi");
Kod 3-15. if blou rnei - 3
Gerek kodun okunurluunun kaybolmamas, gerekse dalgnlkla yaplabilecek
hatalarn nne geilebilmesi asndan, if ya da else bloklarn tek
satrdan olusalar bile { } arasna almak iyi bir programlama alkanldr.
Bir if blounun iine baka if deyimi ya da deyimleri de gelebilir. Burada
herhangi bir snr yoktur. Algoritmaya gre, iie if deyimleri yazlabilir.
rnek:
int a = 7, b = 3, c = 1;
if (a > b) {
System.out.println("a, b'den byktr.");
if (a > c) {
System.out.println("a, c'den de byktr.");
}
else {
System.out.println("a, c'den byk deildir.");
}
}
Kod 3-16. ie if deyimleri
kt:
a, b'den byktr.
a, c'den de byktr.
3.6.2 if else if deyimi
u ekilde yazlr:
if (1. koul ifadesi) {
1. koulun doru olmas durumunda iletilecek kod kesimi
}
else if (2. koul ifadesi) {
2. koulun doru olmamas durumunda iletilecek kod kesimi
}
... // istenildii kadar else if blou
else {
hibir koulun doru olmamas durumunda iletilecek kod kesimi
}

if - else if deyimleri, bir koulun salanmad durumda dier koul
ya da koullarn denetlenmesini salayan bir yapdadr. Denetlenen
koullardan herhangi birisinin sonucu mantksal doru olursa, o kod blou
iletilir ve programn ak en sonraki else blounun bitimine sapar. Hi
bir koul doru deilse, o zaman else blou iletilir.
else blounun yazlmas zorunlu deildir.
rnek:
int a = -1;
System.out.println("Denetimden nceki kod kesimi");
if (a > 0) {
System.out.println("a, 0'dan byktr.");
}
else if (a < 0) {
System.out.println("a, 0'dan kktr.");
}
else {
System.out.println("a'nn deeri 0'dr.");
}
System.out.println("Denetimden sonraki kod kesimi");
Kod 3-17. if else if deyimi rnei
kt:
Denetimden nceki kod kesimi
a, 0'dan kktr.
Denetimden sonraki kod kesimi
ktda grld gibi, kod bloklarndan yalnzca birisi iletilmitir.
3.6.3 switch deyimi
switch deyimi, if-else-if deyimleri ile yazlabilecek bir kod kesimini
daha basite yazmay salayan, bir ifadenin deerine gre dallanmay
salayabilen bir deyimdir.
Aadaki gibi yazlr:
switch (ifade) {
case deger1:
ifadeler;
break;
case deger2:
ifadeler;
break;
....
case degerN:
ifadeler;
break;
default:
ifadeler;
}
switch deyiminden sonra parantez ierisine bir ifade yazlr. Bu ifade, tek
bana bir deiken olabilecei gibi, herhangi bir matematiksel ilem ya da
ilev ars da olabilir. case satrlar, ifadenin deerini denetler. Herhangi
bir case satrnda eitlik yakalanabilirse, o case satr iletilir. break
deyimi, denetim yapsndan kmaya yarayan deyimdir ve bir case satr
iletildikten sonra dierlerinin iletilmemesini salar. Ancak yazlmas
zorunlu deildir. default ise, hibir case satrnda ifadenin deerinin
yakalanamamas durumunda iletilmek istenen kod kesiminin kodlanaca
yerdir, yazlmas zorunlu deildir.
int ay = 5;
System.out.println("switch'ten nceki kod kesimi");
switch (ay) {
case 1: System.out.println("Ocak"); break;
case 2: System.out.println("ubat"); break;
case 3: System.out.println("Mart"); break;
case 4: System.out.println("Nisan"); break;
case 5: System.out.println("Mays"); break;
case 6: System.out.println("Haziran"); break;
case 7: System.out.println("Temmuz"); break;
case 8: System.out.println("Austos"); break;
case 9: System.out.println("Eyll"); break;
case 10: System.out.println("Ekim"); break;
case 11: System.out.println("Kasm"); break;
case 12: System.out.println("Aralk"); break;
default: System.out.println("Ay 1 - 12 aralnda deil");
}
System.out.println("switch'ten sonraki kod kesimi");
Kod 3-18. switch deyimi rnei
kt:
switch'ten nceki kod kesimi
Mays
switch'ten sonraki kod kesimi

switch deyimi kullanlrken break deyimlerinin dikkatli kullanlmas gerekir.
break deyiminin unutulmas ya da yazlmamas durumunda, case satr
iletildikten sonra switch deyiminin sonuna saplmayacak, ileyi bir
sonraki case satrndan devam edecektir. if-else if kod bloklar, switch
bloklarna oranla hata yapmanza daha az yatkndr.
rnek:
int ay = 5;
switch (ay) {
case 12:
case 1:
case 2: System.out.println("K"); break;
case 3:
case 4:
case 5: System.out.println("lkbahar"); break;
case 6:
case 7:
case 8: System.out.println("Yaz"); break;
case 9:
case 10:
case 11: System.out.println("Sonbahar"); break;
default: System.out.println("Ay 1 - 12 aralnda deil");
}
Kod 3-19. break kullanlmayan switch deyimi rnei
kt:
lkbahar
3.7 Dngler (Loops)
Dngler, belirli bir koul saland srece tekrarlanmas gereken iler
iin kullanlan programlama geleridir. Javada for, while ve do-while
olmak zere 3 adet dng deyimi bulunmaktadr.
Herhangi bir algoritmada hangi dngnn kullanlmas gerektii ile ilgili
kesin kurallar yoktur. Dngler uygun deiiklikler ile ayn ii yapacak
ekilde kodlanabilirler. Ancak genel eilim, ka kere dnecei belli
olmayan, koulun bir girdiye (rnein bir dosyadan okunan ya da
kullancnn girdii deerlere) gre denetlendii durumlarda while ya da
do-while dngsn, diziler gibi, tekrar saysnn belli olduu durumlarda
for dngsn kullanmak ynndedir.
3.7.1 while dngs
u ekilde yazlr:
while (koul ifadesi) {
deyimler;
}
while szc ile koulun iine yazld parantezler zorunludur. Koul
saland srece while blounun iindeki kod kesimi iletilecektir.
rnek:
int i = 1;
while (i <= 5) {
System.out.println(i + ". kez iletildi..");
i++;
}
Kod 3-20. while dngs rnei
kt:
1. kez iletildi..
2. kez iletildi..
3. kez iletildi..
4. kez iletildi..
5. kez iletildi..
3.7.2 do - while dngs
u ekilde yazlr:
do {
deyimler;
} while (koul ifadesi);
do ve while szckleri ile koulun iin yazld parantezler zorunludur.
Koul saland srece do-while blounun iindeki kod kesimi
iletilecektir.
rnek:
int i = 1;
do {
System.out.println(i + ". kez iletildi..");
i++;
} while (i <= 5);
Kod 3-21. do-while dngs rnei
kt:
1. kez iletildi..
2. kez iletildi..
3. kez iletildi..
4. kez iletildi..
5. kez iletildi..

do-while dngsnde, dng blou iindeki kod kesimi en az bir kez
mutlaka iletilecektir. nk nce dng blou iletilip sonra koul
denetlenmektedir. while dngsnde ise nce koula baklp sonra dng
blou iletildii iin, dngye hi girilmemesi olasdr.
3.7.3 for dngs
u ekilde yazlr:
for (ilk_deger_atama; koul; her_dnte) {
deyimler;
}
Bu yazlta for szc, ilk_deger_atama, koul ve her_dnte
alanlarnn iine yazld parantezler ve ; (noktal virgl) iaretlerinin
yazlmas zorunludur.
ilk_deger_atama: Dngye ilk defa girilirken iletilecek kod kesimidir.
Yalnzca bir kez iletilir. Bo braklabilir ya da birden fazla deyimden
oluabilir. Birden fazla deyimden oluuyorsa, deyimler , (virgl) iareti
ile birbirlerinden ayrlr. Genellikle dng deikeninin ilk deerinin
verilmesi iin kullanlr ve tek deyim ierir.
koul: Dng blou iletilmeden nce denetlenecek koul ifadesini ierir.
while dngsnde olduu gibi, nce koul denetlenir, koulun mantksal
doru olmas durumunda dng blou iletilir.
her_dnte: Dng blou iletildikten sonra, koul yeniden
denetlenmeden hemen nce iletilecek kod kesimidir. Dng blounun her
iletilmesinden sonra bir kez iletilir. Bo braklabilir ya birden fazla
deyimden oluabilir. Birden fazla deyimden oluuyorsa, deyimler ,
(virgl) iareti ile birbirlerinden ayrlr. Genellikle dng deikeninin
deerinin gncellenmesi iin kullanlr ve tek deyim ierir.
rnek:
int i;
for (i = 1; i <= 5; i++) {
System.out.println(i + ". kez iletildi..");
}
Kod 3-22. for dngs rnei - 1
kt:
1. kez iletildi..
2. kez iletildi..
3. kez iletildi..
4. kez iletildi..
5. kez iletildi..
Ayn dng u ekilde de yazlabilir:
for (int i = 1; i <= 5; i++) {
System.out.println(i + ". kez iletildi..");
}
Kod 3-23. for dngs rnei 2
Grld gibi dng deikeni ilk_deger_atama ksmnda da
tanmlanabilir. Byle tanmlanmas durumunda, dng deikeninin (bu
kodda i adl deiken) tanm alan for dngs ile snrldr. Baka bir
deyile for dngsn bitiren } iaretinden sonra dng deikeni
tanmszdr.
Ayn dng ilk_deger_atama ve her_dnte ksmlar bo braklacak
ekilde yazlabilir:
int i = 0;
for ( ; i <= 5; ) {
System.out.println(i + ". kez iletildi..");
i++;
}
Kod 3-24. for dngs rnei - 3
for dngsn yalnzca koul alann kullanp dier alanlar kullanmadan
kodladmzda, while dngsne ok benzedii grlyor. Bu durumda for
yerine while kullanmak daha anlaml olabilir!
ilk_deger_atama ve her_dnte ksmlarnda virgl kullanmn u
ekilde rnekleyebiliriz:
for (int i = 1, j = 10; i <= j; i++, j--) {
System.out.println("i: " + i + ", j: " + j);
}
Kod 3-25. for dngs rnei - 4
kt:
i: 1, j: 10
i: 2, j: 9
i: 3, j: 8
i: 4, j: 7
i: 5, j: 6
Ayn dng u ekilde de yazlabilir:
int j = 10;
for (int i = 1; i <= j; i++) {
System.out.println("i: " + i + ", j: " + j);
j--;
}
Kod 3-26. for dngs rnei - 5
3.8 zet
Java, C, C++ ve C# dillerine ok benzer. Szdizim kurallar, deiken
tanmlamalar ve ilk deer atama kurallar, denetim ve dng yaplar
neredeyse ayndr.
Javada aklama satrlar javadoc etiketleri ve arac ile dierlerinden
ayrlmaktadr. Benzer aralar ise Java teknolojilerinin ounda kod ya da
belge retmek amacyla sklkla kullanlmaktadr.

4 Uygulama Gelitirme Ortam
Java ile uygulama gelitirmek iin eitli Tmleik Uygulama Gelitirme
Ortam (Integrated Development Environment - IDE) yazlmlar
kullanlmaktadr. Ancak bu ortamlarn birok ayrnty kullancdan
gizleyerek alyor olmalar, platformu ve dili yeni renen kiilerin
gerekte neler olup bittiini bilmeden kod yazabilmeleri sonucunu
dourmaktadr. Tamamen yabanc bir ortamda fazla birey bilmeden
alr programlar oluturabilmek balangta cazip gelse de, renme
eylemi asndan grnd kadar faydal deildir. Ama renmek
olduuna gre nce byle bir ara olmadan ilerin nasl yaplacan
grmek daha doru olacaktr. Sonraki aamada ise daha hzl ve kolay
alabilmek iin elbette uygulama gelitirme ortamlarndan faydalanmak
gerekir.
4.1 JDK ve JRE
JDK, Java Development Kit szcklerinin ba harflerinden oluturulmu bir
ksaltmadr. Java programlarnn gelitirilip altrlabilmesi iin gerekli
ara ve ktphaneleri ieren paket JDK ad ile sunulmaktadr.
JRE ise Java Runtime Environment szcklerinin ba harflerinden oluur.
Java programlarn altrmak (gelitirmek iin deil!) iin gerekli
bileenleri ierir.
Eer bilgisayarnzda Java ile program gelitirmeyecek, yalnzca Java
programlarn altracaksanz, bilgisayarnzda JRE bulunmas yeterlidir.
Ancak eer kod gelitirecekseniz, JDKya gereksinim duyarsnz.
JDK kurulum paketinin iinde JRE de gelmektedir. Yani ikisini ayr ayr
indirip kurmanza gerek yoktur.
http://java.sun.com/javase/downloads/index.jsp adresinden JDKy
indirmek iin gerekli balantya tklayn. Bu balant sizi farkl platformlara
ait JDKlar indirebileceiniz sayfaya gtrecektir. rneklerimizi
WindowsXP zerinde yazacamz iin biz jdk-6-windows-i586.exe
(kitabn yazlma zamannda JDKnn bu srm var) dosyasn indirdik.
Ancak siz kendi kodlarnz hangi platformda yazacaksnz, ona uygun
JDKy seebilirsiniz.
JDK kurulum dosyasna ift tkladnzda iki ayr kurulum balatlacaktr.
Bunlardan ilki JDKnn kurulumudur. Varsaylan kurulumu gerekletirebilir
ya da kendinize gre zelletirme yaparak hedef klasr deitirebilir,
demolar ve kaynak kodlar kurmamay seebilirsiniz.
kinci kurulum ise Public JRE adl bir programa aittir. Bu kurulumu
varsaylan haliyle gerekletiriniz. Public JRE, makinanzda JVM ortamn
oluturur ve JVM gereksinimi olan dier programlarnza da bu ortamdan
faydalanma olana salar.
JDKy makinanza kurduktan sonra, ncelikle evre deikenlerini
gncellemeniz gerekir:
PATH deikeni: Gncellenmesi gereken evre deikenlerinden ilki PATH
deikenidir. JDKy kurduunuz klasrn altndaki bin klasrn PATH
deikenine tanmlamalsnz. Bunu WindowsXPde u ekilde
yapabilirsiniz:
Balat (Start) -> Ayarlar (Settings) -> Denetim Masas (Control
Panel) -> Sistem (System) penceresini an.
Gelimi (Advanced) sekmesine gelin.
evre Deikenleri (Environment Variables) tuuna tklayn.
Alttaki Sistem Deikenleri (System variables) penceresinde PATH
adl deikeni bulup Dzenle (Edit) tuuna tklayn.
Bu deikenin iinde tanml deerler varsa bunlar deitirmeyin, en
sona gidip ; yazdktan sonra JDKy kurduunuz klasrn adn
buraya ekleyin.
PATH deikenine bir klasr eklendii zaman, eklenen klasrn altndaki
dosyalar bilgisayarn herhangi bir klasrnden eriilebilir hale gelir.
Bylece bir alma klasrnde alrken JDKnn bin klasrnn altnda
bulunan aralar rahata kullanabilirsiniz. Bu aralardan bazlarna hzlca
bakalm:
javac.exe: Java programlarn derlemek iin kullanlr.
java.exe: Derlenmi Java programlarn altrmak iin kullanlr.
javadoc.exe: Java kaynak kodlarndaki kod ii belgelemeyi
kullanarak belge oluturmak iin kullanlr.
appletviewer.exe: Applet kodlarn altrmak iin kullanlr.
javap.exe: Derlenmi bir snf dosyasnn iinde neler olduunu
grmek iin kullanlr.
jar.exe: Java programlarn oluturan dosyalar sktrarak
paketlemek ya da bu paketleri amak iin kullanlr. zip biiminde
(format) dosyalar retebilir.
CLASSPATH deikeni: Gncellenmesi gereken bir dier evre deikeni
ise CLASSPATH deikenidir. Eer evre deikenleri arasnda CLASSPATH
deikeni tanmlysa bunu ya silin ya da ieriini yalnzca . olacak ekilde
gncelleyin.
Baz programlar PATH deikenine kendi kurulumlar ile birlikte gelen JDK
veya JREyi eklerler. Bu durumda PATH deikeninin iinde farkl JDK
srmlerine ait olan ve ; iaretiyle ayrlm birden ok tanmlama
bulunabilir. Bu ise Java programlarn derleyememenize ya da
altramamanza neden olabilir. Eer PATH deikeninde yle tanmlar
varsa silin.
4.2 Java ile ilk program
Bu ksmda yazlan programlarda henz anlatmadm baz deyimler ve
anahtar szckler kullanacam. Bunlar kullanmamn nedeni zorunlu
olmam. nk Java ile programlama yaparken uymamz gereken baz
kurallar var. Ancak henz bu kurallardan bahsetmediim iin, yazdm
programlarn bu ksmlarn aklamayacak, imdilik bunlar birer
programlama kalb olarak renmenizi isteyeceim. Daha sonra ilgili
konular aklanrken bu konulara geri dnecek ve gerekli aklamalar
yapacam.
Bir programlama dili renirken, ncelikle kendinize bir alma alan
oluturmakta fayda olabilir. rnein C:\calisma gibi bir klasr oluturup
yazdnz btn programlar bunun altnda aacanz alt klasrlerde
saklayabilirsiniz. Ben de buradaki rneklerde C:\calisma adl klasr
kullanacam.
4.2.1 lk program
Aada ekrana lk Java programmz yazdran basit bir programn
kaynak kodunu grebilirsiniz.
public class IlkProgram {
public static void main(String[] args) {
System.out.println("lk Java programmz..");
}
}
Kod 4-1. lk Java program
Bu kaynak kodu herhangi bir metin dzenleyici ile (rnein Notepad ile)
yazp IlkProgram.java adl bir dosyaya kaydediniz. Dikkat ederseniz,
kaynak kodu iine yazdm dosya ile kodun bandaki snf ad
(IlkProgram) ayn ve byk-kk harf duyarl (case-sensitive). Yani
dosyann adn rnein ilkprogram.java yapmamalsnz.
Kural: Java snfnn ad ile bu snfn kaydedildii dosyann ad byk-kk
harf duyarl olacak ekilde AYNI olmaldr!
4.2.2 Derleme
IlkProgram.java dosyasn C:\calisma altna kaydettik. imdi bu
program derlemek iin konsolu ayoruz.
Konsolu amak iin Balat (Start) -> altr (Run) mensn seip buraya
cmd yazp Enter tuuna basabilir ya da Balat (Start) -> Donatlar
(Accessories) -> Komut stemi (Command Propmt) mensn seebilirsiniz.
Konsolda C:\calisma klasrne gidiyoruz: cd c:\calisma
imdi programmz derliyoruz: javac IlkProgram.java

ekil 4-1. IlkProgram.java dosyasnn derlenmesi
ekilde grld gibi program derlendikten sonra IlkProgram.class adl,
byte-kod ieren Snf Dosyas (Class file) olutu. Eer herhangi bir
szdizim hatas olsayd derleme ilemi baarsz olacak ve snf dosyas
olumayacakt. rnein, eer kaynak kodu ieren dosyay
ilkprogram.java ad ile (snf ad ile dosya ad ayn olmayacak ekilde)
kaydetseydik bir derleme hatas alacaktk ve snf dosyas olumayacakt:

ekil 4-2. ilkprogram.java dosyasnn derlenmesi
4.2.3 altrma ve main yntemi
Program baar ile derlediimize gre artk altrabiliriz. Ancak
altrmadan nce programn nasl alacana bir bakalm.
Derlenmi bir snf dosyas, eer iinde
public static void main(String[] args) {
....
}
eklinde yazlm bir yntem varsa altrlabilir bir dosyadr. Bu dosyay
altrdmz zaman (az sonra nasl altracamz greceiz), program
main ynteminin ilk satrndan almaya balar.
rneimizde, main ynteminin iinde yalnzca bir satr kod bulunuyor:
System.out.println(lk Java programmz..)
System.out.println() yntemi, iaretleri arasnda verilen dizgiyi
ekrana yazdran bir yntemdir. Dolaysyla programmz altrdmzda
ekranda
lk java programmz..
yazmasn bekliyoruz.
Bir snf dosyasn altrmak iin konsolda
java IlkProgram
yazp Enter tuuna basmamz gerekiyor. Dikkat ederseniz,
java IlkProgram.class
yazmyoruz! java IlkProgram ifadesi ile JVMye hangi snf altrmak
istediimizi belirtiyoruz. JVM, adn verdiimiz IlkProgram adl snf Snf
Ykleyici grevi ile bellee ykleyip, bu snfn iindeki main yntemini
iletmeye balyor. Burada, main ynteminin zel bir yntem olduunu,
altrlmak istenen bir snf dosyasnda JVM tarafndan aranan bir yntem
olduunu ve bulunabilmesi iin de aynen burada yazld ekilde yazlmas
gerektiini syleyelim. Baka bir deyile, eer yazdmz snf altrmak
istiyorsak, o snfn iinde
public static void main(String[] args)
adl bir yntem olmas gerekiyor.
main yntemi yazlrken, args yerine baka herhangi birey yazlabilir.
Ancak genellikle args szc kullanlr ve bu szck arguments
szcnn ksaltmasdr. arguments ile ifade edilen, snf altrlrken
JVM tarafndan bu snfa verilen argmanlardr. Bunula ilgili daha ayrntl
bilgiyi daha sonra vereceiz.
Aada programn altrln grebilirsiniz:

ekil 4-3. IlkProgram snfnn altrlmas
Eer java IlkProgram.class yazarsak ne olacana da bakalm:

ekil 4-4. IlkProgram snfnn hatal altrlmas
Grld gibi bir hata olutu ve programmz altrlamad. imdilik
programn almadn grmekle yetinelim ve hatann ne olduu ile ilgili
ayrntl bilgiyi sonraya brakalm.
4.3 Eclipse Platformu
Java programlarnn gelitirilmesi ve altrlmas iin JDKnn nasl
kullanlabileceini grdk. JDK, temelde Java programlarnn
gerekletirilmesi iin yeterli olsa da byk uygulamalarn daha hzl ve
kolay gelitirilebilmesi iin birok tmleik uygulama gelitirme ortam
bulunmaktadr. Bu ortamlar hem kolay kullanlmalar sayesinde, hem de
sunduklar birok ara yardm ile programcnn iini kolaylatrr ve
azaltrlar.
Bu ksmda, birok cretli rnn arasndan syrlmay baarm, ak
kaynak kodlu ve cretsiz bir uygulama gelitirme platformu olan Eclipse
Platformuna hzl bir bak atlacaktr.
Bir teknoloji, programlama dili.. vb renirken, nce hibir ara kullanmadan
ilerin nasl yaplabildiini renin. Sonra arac kullanarak bu ileri kolay
yapmann rahatln grn. Bylece hem kullandnz aracn size ne
getirdiini daha kolay farkedersiniz, hem de herhangi bir baka arala
alabilecek bilgi birikimine sahip olursunuz. Sonuta btn aralar, o
aralar kullanlmadan da yaplabilecek olan ileri daha kolay yapmann
yollarn sunarlar. Siz neler olup bittiini bilirseniz hangi arala altnzn
bir balaycl ve nemi kalmaz.




5 Java ile Nesneye Ynelik Programlama
Bu blmde NYP kavramlar zerinde duracak, bu kavramlarn Javada
nasl gerekletirildiine bakacaz.
5.1 Snf Tanmlar
Snf ve nesne kavramlarndan daha nce bahsetmitik. Snf, bir grup
nesnenin ortak zellik ve davranlarn ieren tanm, nesne ise bu tanma
gre oluturulmu fiziksel bir varlkt. NYP ise bir nesnenin baka bir
nesneye ileti gndermesi, iletiyi alan nesnenin bu iletiye uygun davran
sergileyerek kendi durumunda bir deiiklik yapmas eklinde
gerekletiriliyordu (Bkz: Nesneye Ynelik Programlama).
Grld gibi, nesnelerimizi oluturabilmek iin nce o nesnelerin ait
olduklar snflar tanmlamamz gerekiyor. Snf tanmlarnn iine zellikler
ve davranlar yazacaz.
rnek olarak Zaman adl bir snf tanm yapalm. Zaman snfmzn saat,
dakika ve saniye adl zellikleri ile ilerle() adl bir davran olsun. saat,
dakika ve saniye zelliklerini, Zaman snfna ait bir nesnenin durumunu
oluturacak tamsay deerler, ilerle() davrann ise bu nesneye ilerle
iletisi gnderildiinde, o nesneyi bir saniye sonrasna gtren bir davran
olarak dnelim.
Snf tanm yaplrken, zellikler snfn iine deikenler olarak,
davranlar ise ilevler olarak kodlanr.
zellik (property) NYP balamnda, nesnenin durumunu oluturan, nesnenin
ait olduu snfn iine kodlanm herbir deikene verilen isimdir. zellik,
Java balamnda nitelik (attribute) olarak adlandrlr.
Davran (behaviour) NYP balamnda, nesnenin durumunda deiiklik
yapabilen, nesnenin ait olduu snfn iine kodlanm herbir ileve verilen
isimdir. Davran, Java balamnda yntem (method) olarak adlandrlr.

Javada Yntemler
Javada yntemler aynen Cdeki ilevler gibi yazlr. Ksaca hatrlayalm:
Yntemlerin belirli bir biime uygun yazlmalar gerekir. Bu biim u
ekildedir:
tr yntemAdi(parametreListesi) {
}
tr: Yntemin dndrecei deerin trdr. rnein verilen gerel saynn
karekkn bulup dndren bir yntem yazacaksak, yntemden geriye
dnecek deerin tr gerel say tipinde olacaktr. O zaman bu alana gerel
say trn ifade eden double yazarz. Eer yntemin geriye herhangi bir
deer dndrmesi beklenmiyorsa, bu alana deer dnmeyeceini belirtmek
zere void yazlr.
yntemAdi: Ynteme verilen addr. Yntem ad, yntemin ne i yaptn
ifade edecek ekilde zenle seilmelidir. Bylece hem kodun okunurluu
salanabilir hem de daha sonra hangi yntemin kullanlacana kolaylkla
karar verilebilir. rnein karekk bulan yntem iin karekokBul ad
kullanlabilir.
parametreListesi: Bir yntem, kendisine verilen deerler zerinde
alabilir. Karekk bulan yntemin karekkn bulaca deer o yntemin
parametresidir. Parametre listesi, sfr ya da daha ok parametreden oluur.
Her parametrenin nce tr sonra ad yazlr ve parametrelerin arasna ,
(virgl) koyulur.
Bu bilgiler nda, verilen iki tamsaynn ortak blenlerinin en byn
bulan ilevi u ekilde tanmlayabiliriz:
int obeb(int sayi1, int sayi1) {
// buraya obeb bulma algoritmas kodlanacak
}
Benzer ekilde, nesnenin durumunu ekrana yazdran, geriye herhangi bir
deer dndrmeyen yntemi de u ekilde tanmlayabiliriz:
void yaz() {
// buraya nesnenin durumunu ekrana yazan kodlar yazlacak
}


Aada Zaman snfna ait Java kodu grlmektedir:
class Zaman {

int saat;
int dakika;
int saniye;

/**
* Her arldnda nesneyi bir saniye sonrasna gtren yntem.
* saniye 59, dakika 59, saat ise 23'ten byk olamaz.
*/
void ilerle() {
saniye++;
if (saniye == 60) {
saniye = 0;
dakika++;
if (dakika == 60) {
dakika = 0;
saat++;
if (saat == 24) {
saat = 0;
}
}
}
}
}
Kod 5-1. Zaman snf
Grld gibi zellikleri snfn iinde birer deiken olarak, davran ise
yine snfn iinde bir ilev olarak kodladk. Zaman snfnn bir snf
olduunu belirten anahtar szck ise class szc. Bu kodu Zaman.java
adl bir dosyaya kaydettikten sonra derleyebiliriz.
u anda szdizim kurallar asndan doru ve geerli bir snf yazm
durumdayz ancak henz bu snf mantksal adan kullanlabilir deil.
nk bu snfa ait bir nesne oluturduumuzda nesnemizin durumunu
birer saniye ilerleterek deitirebileceiz fakat herhangi bir anda nesnenin
durumunu renebileceimiz bir davran tanmlam deiliz. Baka bir
deyile zaman ilerletebilir ama deerini renemeyiz; saat ka? diye
soramayz. Zaman snfndan bir nesneye bunu sorabilmemiz iin, nce
snfn iine bu soruyu yantlayabilecek davran tanmlamamz gerekiyor:
/**
* arld zaman nesnenin o anki durumunu ekrana yazar.
*/
void zamaniYaz() {
System.out.println("Zaman: " + saat + ":" + dakika + ":" + saniye);
}
Kod 5-2. Zaman nesnesinin durumunu soran yntem
zamaniYaz() yntemini, Zaman snfna ait herhangi bir nesnenin
durumunu ekrana yazdran bir yntem olarak kodladk. imdi Zaman
snfna ait bir nesne oluturup bu nesneyi kullanan alabilir bir program
elde edebilmek iin main yntemini yazalm.
main yntemini Zaman snfnn iine yazabiliriz. Ancak Zaman snf kendi
bana dnldnde, altrlabilir bir snf olmak zorunda deildir. Bu
snf, yalnzca zaman bilgisini ifade edebilen nesneler oluturulabilmesi iin
yazlm bir tanmdr. Baka bir deyile, Zaman snfna ait kodlarn iinde
bulmay beklediimiz yntemler yalnzca bu snfa ait davranlar olmaldr.
yleyse srf rneimizi altrabilmek iin Zaman snfnn iine, aslnda
kendi davranlar ile ilgisi olmayan main yntemini yazmak gzel bir
yaklam olmayacaktr. main yntemi altrlabilir bir program elde etmek
zere yazlan bir yntem olduundan ve Javada btn kodlarn mutlaka
bir snfn iine yazlmas zorunlu olduundan, bu yntemi Program adl bir
snfn iine yazmak daha iyidir.
rneklerde main yntemini her zaman Program adl bir snfn iine, dier
btn snflar ise btnlklerini koruyacak, yalnzca kendi zellik ve
davranlarn ierecek ekilde kodlayacam.
Aada Program snfnn kodu grnyor:
class Program {
public static void main(String[] args) {
Zaman zamanNesnesi = new Zaman();
zamanNesnesi.ilerle();
zamanNesnesi.zamaniYaz();
}
}
Kod 5-3. Zaman snfn kullanan Program snf
Program adl snf altrdmzda ekranda aadaki kt oluacaktr:
u anki zaman: 0:0:1
imdi bu ktnn nasl olutuuna bakalm:
Daha nce de belirttiimiz gibi main yntemi programn balang
noktasdr. JVM, adn verdiimiz snfn iinde main yntemini bulur ve
main ynteminin ilk satrndan balayarak program iletir. main
ynteminin ilk satrnda, zamanNesnesi ad ile Zaman snfndan bir nesne
oluturulmaktadr (nesne oluturma ile ilgili ayrntl bilgi daha sonra
verilecektir). Daha sonra bu nesneye ilerle() iletisi gnderilerek Zaman
snfna tanmlanm olan ilerle() davrannn gerekletirilmesi
istenmektedir. ilerle() davrannn gerekletirilmesi ilerle()
ynteminin iletilmesiyle olur ve bu yntem nesnenin saniye niteliinin
deerini 1 arttrmaktadr. Nesne ilk oluturulduunda, niteliklerinin
deerlerinin herbirinin deeri 0 (sfr)dr (Zaman snfnn btn nitelikleri
int temel trndedir ve int temel trnn varsaylan deeri 0 (sfr)dr).
ilerle() yntemi bir kez altnda, saniye niteliinin deeri 1 olur.
main ynteminin bir sonraki satrnda ise zamanNesnesinin zamaniYaz()
yntemi arlmaktadr ve bu yntem, niteliklerin o anki deerlerinden
oluturduu dizgiyi ekrana yazmaktadr.
5.2 Nesne Oluturma
Snfn bir tanm, nesnenin ise o tanma gre oluturulmu fiziksel bir
varlk olduunu tekrar hatrlayalm. Bu ifade zerinde biraz durursak u
sonuca varabiliriz: Nesne oluturulmad srece bellekte fiziksel olarak
oluturulmu bir varlk yoktur; snfn nitelikleri iin bellekten yer
ayrlmamtr. rnein, Zaman snfna ait bir nesne oluturulmad srece
saat, dakika ve saniye nitelikleri yalnzca kat zerinde birer tanmdr.
Nesne oluturulduu andan itibaren ise bu niteliklerin her birisi iin
bellekten 32er ikil uzunluunda (int tr 32 ikil uzunlukta), toplam 32 x
3 = 96 ikil uzunlukta yer ayrlacaktr.
5.2.1 new ileci
Herhangi bir snfa ait bir nesne oluturulabilmesi iin new ileci kullanlr.
new, belirtilen snfa ait bir nesne oluturup bu nesnenin bellekteki adresini
(referansn) dndrr.
Kod 5-3e tekrar bakarsak, main ynteminin ilk satrnda
Zaman zamanNesnesi = new Zaman();
Kod 5-4. Zaman snfna ait zamanNesnesi adl nesnenin oluturulmas - 1
yazmaktadr. Bu satr iki farkl satr halinde tekrar yazalm:
Zaman zamanNesnesi;
zamanNesnesi = new Zaman();
Kod 5-5. Zaman snfna ait zamanNesnesi adl nesnenin oluturulmas - 2
imdi de Javada deiken tanmlama ve ilk deer atama ilemlerinin nasl
yapldn hatrlayalm. rnein bir tamsay deiken tanmlamak ve o
deikene 5 deerini atamak iin;
int sayi;
sayi = 5;
yazabileceimiz gibi, tanm yaptmz satrda atama ilemini yaparak
ksaca
int sayi = 5;
de yazabiliriz.
Bu bilgiyi hatrladktan sonra Kod 5-5e geri dnelim:
lk satrda, Zaman snfna ait bir deiken tanm yaplyor; deikenin tr
Zaman, ad ise zamanNesnesi olarak seilmi. kinci satrda ise
zamanNesnesi adl deikene bir deer atanyor. Atanan deer, new
Zaman() deyiminden dnen deer (zamanNesnesi = new Zaman()). Bu
sonu ise Zaman snfna ait, new ileci ile bellekte oluturulan nesnenin
adresi. Yani bu satr iletildikten sonra zamanNesnesi adl deikenin
iinde, bellekteki bir nesnenin (bu nesne Zaman snfna ait) adresi
bulunuyor.
Kod 5-4te ise, ayn ilem tek satrda yazlm. Ayn satrda hem Zaman
snfna ait nesnenin adresini tutabilecek bir deiken tanm yaplm, hem
de Zaman snfndan bir nesne oluturulup, nesnenin adresi tanmlanan bu
deikenin iine atanm.
5.2.2 Referans Tr
new ileci ile bir nesne oluturulduunu ve bu nesnenin bellekteki adresinin
dndrldn syledik. Dndrlen adres, oluturulan nesneye daha
sonra erimek amacyla referans olarak kullanlacaktr. Bu referans
saklayabilmek iin de bir deikene gereksinim vardr. erisinde referans
(nesne adresi) saklayabilen trden deikenlere referans trden deiken
ya da Nesne Tutama (Object Handle) ad verilir ve varsaylan deer
olarak null deerini alrlar. null, bir nesne tutamann iinde o anda
herhangi bir nesnenin adresi olmadn belirten deerdir.
5.2.3 Yn (Heap), Yt (Stack) ve p Toplayc (Garbage
Collector)
JVMden bahsederken sanal donanmn 4 kesimden olutuunu ve bu
kesimlerden birinin yn (heap), birinin de yt (stack) olduunu
sylemitik. imdi yn ve ytn ne olduunu biraz daha aalm:
JVM, oluturulan deiken ve nesneleri ynetmek zere bilgisayarn
belleini kullanr (32-ikillik JVMnin en fazla 4GB bellek kullanabileceini
belirtmitik). Ancak deikenleri ve nesneleri ynetirken farkl bellek
alanlar ve algoritmalardan faydalanr.
Bir yntem arld zaman, o ynteme ait yerel deikenler ile yntemin
parametreleri, yntemin dn adresi ve dn deeri ile birlikte yt ad
verilen bellek alannda oluturulur. Yntemin almas sona erdii zaman
bu bilgiler yttan atlr (bu bilgilere tekrar eriilemez). Deikenlerin
tanm alanlar ve yaam sreleri yntem ile snrldr. Yntem yeniden
arldnda btn bu alanlar ytta yeniden ve yeni deerleri ile
oluturulacaktr.
Nesneler ise ynda oluturulurlar; new ile yeni bir nesne oluturulduu
zaman, JVM bu nesneyi yn ad verilen bellek alannda saklar. Nesnenin
adresi ise ytta bulunan referans trdeki bir deikenin iinde saklanr.
Bu durumda, nesneyi oluturan kod satrnn iinde bulunduu yntem
sona erdiinde nesnenin referansn saklayan deiken yttan atlr.
Ancak nesnenin kendisi hala bellektedir. Bir Java programnn alt sre
boyunca oluturulan btn nesneler ynda saklanr.
Ynn ynetilmesi iin JVMler farkl algortimalar kullanrlar. JVM ynn
yeterince dolduuna karar verdii zaman, artk kullanlmayan nesnelerin
(bir nesnenin kullanlmyor olmas, o nesnenin referansn saklayan hibir
deiken olmamas anlamna gelir) kullandklar bellek alanlarn tekrar
kazanabilmek iin p Toplayc adl grevi devreye sokar. p Toplayc,
ynda bulunan ve kendisine hi referans olmayan nesneleri (ki bunlara
p denilebilir) bularak bunlar ortadan kaldrr ve bunlarn kullanmakta
olduklar bellek alanlarn yeniden yna kazandrr. p Toplaycnn ne
zaman alacana JVM karar verir. Java programlarnn almas
srasnda p Toplayc hi devreye girmeyebilir de.
Bellek alanlarnn bu ekilde JVM tarafndan ynetiliyor olmas, C ya da
C++ gibi dillerle programlama yaparken programcy yoran bellek ynetimi
kodlarn ortadan kaldrmaktadr. Ancak yine de unu sylemekte fayda
vardr: nesne oluturmak ve kullanlmayan nesneleri bularak bunlarn
tkettii bellek alanlarn yeniden kazanmak ileyici ve bellek asndan
maliyetli bir ilemdir programcnn gereksiz nesne oluturmaktan
kanmas gerekir.
Bellek ynetiminin JVM tarafndan gerekletiriliyor olmas programcnn
iini kolaylatryor olabilir ancak programc kendi programnn baarmn
drmemek iin dikkatli kod yazmaldr.
Aadaki ekilde, nesne oluturulmas aamalarnda bellein durumu
grlmektedir.

ekil 5-1. Nesne oluturulmas srasnda bellein grnm
ekilde, herhangi bir yntem arlmadan nce bellein durumu 1. admda
gsterilmitir. 2. admda referans deiken tanmlanmaktadr. ekilde de
grld gibi, new ileci iletilmedii srece bellekte nesne yoktur ve
referans deikenin ilk deeri nulldur. new ile nesne oluturulup
nesnenin adresi referans deikene aktarldktan sonra, yndaki nesneye
referanslarn says (nesneyi iaret eden oklarn says) 1 olur. Yntem
sona erip yttaki deiken ortadan kalktktan sonra ise nesneye
referanslarn says 0 (sfr)dr ve bu nesne artk p Toplayc tarafndan
yok edilmeye adaydr.
5.2.4 Kurucular (Constructors)
Nesnenin ancak new ileci iletildikten sonra bellekte var olduunu grdk.
Koda dikkatli bakarsak, new ilecinden hemen sonra gelen ifadenin
Zaman() olduunu, Zamann ise nesnesini oluturduumuz snfn ad
olduunu grrz. Ayrca Zamann hemen yanndaki () iaretleri, Java
dilinde yntem arlarn akla getirmektedir. Kod 5-3e tekrar bakarsak,
zamanNesnesi deikenini kullanarak ilerle yntemini aran deyimin
zamanNesnesi.ilerle()
eklinde kodlandn grrz. () iaretlerinin yntem arlarnda
kullanldn dndmzde, new Zaman() ifadesini Zaman adl yntemi
aran bir ifade olarak grebiliriz. Baka bir deyile new ileci, snf ad ile
ayn isme sahip zel bir yntemi armaktadr gibi bir yorum yapabiliriz.
te bu zel ileve kurucu (constructor) ad verilir. Kurucu, bir nesne
oluturulurken mutlaka ilk olarak ve yalnzca bir defa alan, almas
tamamlandnda ise ynda artk bir nesnenin var olduu zel bir yntem
olarak dnlebilir. Bir kurucuyu snfn iindeki dier yntemlerden
ayran iki temel zellii vardr:
1. Snf ile ayn addadr.
2. Dndrebilecei deer alan tanml deildir. Burada tanml
olmamaktan kast, kurucunun deer dndrmeyen (void) bir
yntem olmas deil, byle bir tanmn var olmamasdr.
rnein, Zaman snf iin tanmlanacak bir kurucu u ekilde kodlanabilir:
Zaman() {
// buraya kurucunun yapmas istenen ilemler kodlanmal
}
Kod 5-6. Zaman snfnn kurucusu
Kod 5-6da grld gibi, kurucunun ad snf ad ile ayn ve kurucunun
dndrecei deerin trnn yazlmas gereken alanda hibirey yazmyor.
imdi hemen akla gelen iki soruyu yantlamaya alalm:
Kurucu niye yazlr?
Nesneye ynelik programlamada nesnelerin durumlarnn kullanldn
hatrlayalm. yleyse programn herhangi bir annda, bir nesnenin
durumunun anlaml ve tutarl olmas gerekir, aksi taktirde programda
yanl ya da anlamsz durumlar oluabilir. rnein, Zaman programmzda
saat niteliinin deerinin hibir zaman 0 23 aralnn dnda, dakika ve
saniye niteliklerinin de hibir zaman 0 - 59 aralnn dnda olmamas
gerekir. Zaman snfnn davranlarn bunu salayacak ekilde kodlarz ve
nesnenin durumunun tutarsz hale gelmesine izin vermeyiz. Ancak nesne
ilk oluturulduu anda da durumunun anlaml olmas gerekir. Eer Zaman
rneimizde 0 (sfr) deeri saat, dakika ya da saniye niteliklerinden
herhangi birisi iin anlamsz olsayd, nesne oluturulduktan hemen sonra
nesnenin durumu anlamsz olacakt. nk niteliklerin hepsi int trnde
tanmlanm ve int trnn varsaylan deeri 0 (sfr).
Kurucunun rol, nesnenin oluturulmas srasnda ilk anlaml durumuna
atanmasn salamaktr. lk olarak kurucunun alaca kesin olduundan
ve kurucu sonlandnda nesne oluturulmu olacandan, nesnenin ilk
durumunun anlaml olmasn salayacak kodun yazlabilecei yer
kurucudur.
Kurucu yazmazsak ne olur?
Kod 5-1de Zaman snfnn iine kurucu yazmadmz halde, Kod 5-3te
Zaman zamanNesnesi = new Zaman();
eklinde kodlanm olan program iin derleyici hata vermedi ve program
sorunsuz alt. Bu nasl olabilir?
Eer bir snf iin kurucu yazlmazsa, kaynak kod derlenmeden hemen
nce derleyici tarafndan varsaylan kurucu (default constructor) retilir ve
snf yle derlenir. Varsaylan kurucu, hibir parametre almayan ve { }
iaretlerinin aras bo olan bir kurucu olarak dnlebilir:
Zaman() {
}
Snfn iine bizim bir kurucu yazmamz durumunda ise derleyici artk
herhangi bir ekilde kurucu retmez.
Kurucu, nesnenin nasl oluturulacan syleme olana salad kadar,
nasl oluturulamayacan syleme olana da salar. Eer snfn iine bir
kurucu tanmlanmsa, derleyicinin artk varsaylan kurucu retmeyeceini
syledik. Eer tanmlanan kurucu bir takm parametreler alyorsa bu, o
snfa ait bir nesne oluturulabilmesi iin mutlaka bu parametreler ile
kurucunun arlmasn zorlayacaktr. rnein Zaman snf iin aadaki
gibi bir kurucu tanmlarsak, artk
Zaman zamanNesnesi = new Zaman();
eklinde kod yazamayz. nk artk derleyici tarafndan varsaylan kurucu
retilmeyecektir ve Zaman snfnn iinde hi parametre almayan bir
kurucu tanm da yoktur.
/**
* Nesnenin ilk durumunu verilen deerlere eker
*
* @param st Saat iin balang deeri
* @param dk Dakika iin balang deeri
* @param sn Saniye iin balang deeri
*/

Zaman(int st, int dk, int sn) {
saat = st;
dakika = dk;
saniye = sn;
}
Kod 5-7. Zaman snfnda parametreli kurucu
Bu durumda, eer bir Zaman nesnesi oluturulmak isteniyorsa, una
benzer ekilde kod yazlmas gerekir:
Zaman zamanNesnesi = new Zaman(0, 0, 0);
5.2.5 this anahtar szc
Zaman snfna ait parametreli kurucuyu yazarken niteliklere dorudan
eriebildik. nk bu niteliklerin tanml olduklar alan snf tanmn
balatan { iareti ile snf tanmn bitiren } iareti arasdr.
Aada parametreli kurucunun kodu grlmektedir. Dikkat edilirse,
parametre adlar st, dk ve sn olarak seilmi, bylece saat, dakika ve
saniye adl nitelikler ile parametrelerin ayn isimde olmalar
engellenmitir. Eer parametre adlar da saat, dakika ve saniye olarak
seilirse ne olur? Bu durumda kurucu iinde rnein saat ad ile ancak
saat adl parametrenin kendisine eriilebilir; saat niteliine bu ekilde
eriilemez.
Zaman(int st, int dk, int sn) {
saat = st;
dakika = dk;
saniye = sn;
}
Kod 5-8. Parametreli kurucu
Nitelik ile parametrenin adlar ayn ise bu ikisi arasnda ayrm yapabilmek
iin this anahtar szc kullanlr:
Zaman(int saat, int dakika, int saniye) {
this.saat = saat;
this.dakika = dakika;
this.saniye = saniye;
}
Kod 5-9. this anahtar szcnn kullanl
Bu kodu aklayalm: parametre adlar saat, dakika ve saniye olduu
iin, kurucunun iinde rnein saat yazldnda saat adl parametrenin
deerine ulalmaktadr. Gelen parametrenin deerinin nitelik olan saatin
iine atanabilmesi iin nitelik olan saat, this anahtar szc ile
belirtilmitir:
...
this.saat = saat;
...
this anahtar szc, deyimin iletildii anda hangi nesne ile allyorsa
o nesnenin kendisine referanstr. Diyelim ki Zaman snfna ait zaman1 ve
zaman2 nesneleri oluturuluyor. this anahtar szc,
Zaman zaman1 = new Zaman(3, 16, 34);
kodu iletilirken zaman1 referans ile gsterilen nesnenin adresini,
Zaman zaman2 = new Zaman(15, 0, 0);
kodu iletilirken ise zaman2 referans ile gsterilen nesnenin adresini
belirtir.
Bir snfn iine yazlan kodlarda, nesne referanslar zerinden eriilebilecek
nitelik ya da yntem arlarnn kodlandklar alanlarda aslnda this
anahtar szc gizli olarak (implicitly) zaten kullanlmaktadr. Eer biz bu
anahtar szc kodlarsak, yalnzca aka (explicitly) yazm oluruz.
Baka bir fark yoktur.
Parametre ad ile nitelik adnn ayn olduu durumda ise this anahtar
szcnn kullanlmas zorunludur. nk yntemin iindeki kod
kesiminde, parametre kendisi ile ayn addaki nitelie eriimi
engellemektedir.
5.2.6 Kurucu Ar Ykleme (Constructor Overloading)
Bir snf iin birden fazla kurucu tanmlanabilir. Kurucular birbirlerinden
ayracak olan, kurucularn parametreleridir. Parametre saylar ya da
trlerinin farkl olmas sayesinde hangi kurucunun arld
anlalabileceinden bir belirsizlik olumaz.
Ar ykleme (overloading) ifadesi ile anlatlmak istenen, tek bir ismin
birden fazla kurucu iin kullanlmas, ksaca ismin ar yklenmesidir.
Zaman snfna iki tane kurucu yazalm. Bunlardan ilki oluturulacak bir
Zaman nesnesinin btn niteliklerine sfr deerini, ikincisi ise bu niteliklerin
deerlerine parametre olarak verilen deerleri atasn.
Zaman() {
saat = 0;
dakika = 0;
saniye = 0;
}
Zaman(int st, int dk, int sn) {
saat = st;
dakika = dk;
saniye = sn;
}
Kod 5-10. Zaman snf iin kurucular
Zaman snfnn iine birden fazla kurucu tanmlam olduk. Bu durum
herhangi bir derleme hatasna neden olmayacaktr. nk iki kurucu,
parametre listelerinin farkl olmas sayesinde rahatlkla birbirlerinden
ayrlabilmektedir.
Zaman snfmzn birden fazla kurucu ierecek ekilde kodlanm son haline
tekrar bakalm:
class Zaman {

int saat;
int dakika;
int saniye;

/**
* Nesnenin ilk durumunu 0, 0, 0 yapar.
*/
Zaman() {
saat = 0;
dakika = 0;
saniye = 0;
}

/**
* Nesnenin ilk durumunu verilen deerlere eker
*
* @param st Saat iin balang deeri
* @param dk Dakika iin balang deeri
* @param sn Saniye iin balang deeri
*/
Zaman(int st, int dk, int sn) {
if (st >= 0 && st < 24) {
saat = st;
}
if (dk >= 0 && dk < 60) {
dakika = dk;
}
if (sn >= 0 && sn < 60) {
saniye = sn;
}
}

/**
* Her arldnda nesneyi bir saniye sonrasna gtrr.
* saniye 59, dakika 59, saat ise 23'ten byk olamaz.
*/
void ilerle() {
saniye++;
if (saniye == 60) {
saniye = 0;
dakika++;
if (dakika == 60) {
dakika = 0;
saat++;
if (saat == 24) {
saat = 0;
}
}
}
}

/**
* arld zaman nesnenin o anki durumunu ekrana yazar.
*/
void zamaniYaz() {
System.out.println("u anki zaman: " +
saat + ":" + dakika + ":" + saniye);
}
}
Kod 5-11. Zaman snf
5.2.7 Kurucularn Birbirini armas
Bir snfn iine birden fazla kurucu yazdmzda, bazen ayn ii tekrar
tekrar kodluyor olabiliriz. rnein Zaman snfnn iine 3 farkl kurucu
yazalm. Birisi yalnzca saat niteliinin deerini parametre olarak alsn,
birisi hem saat hem dakika iin parametre alsn, sonuncusu da btn
nitelikler iin parametre alsn:
class Zaman {

int saat;
int dakika;
int saniye;

Zaman(int saat) {
if (saat >= 0 && saat < 24) {
this.saat = saat;
}
}
Zaman(int saat, int dakika) {
if (saat >= 0 && saat < 24) {
this.saat = saat;
}
if (dakika >= 0 && dakika < 60) {
this.dakika = dakika;
}
}
Zaman(int saat, int dakika, int saniye) {
if (saat >= 0 && saat < 24) {
this.saat = saat;
}
if (dakika >= 0 && dakika < 60) {
this.dakika = dakika;
}
if (saniye >= 0 && saniye < 60) {
this.saniye = saniye;
}
}
}
Kod 5-12. 3 kuruculu Zaman snf
Kurucular incelenirse, baz kodlarn tekrar tekrar yazld grlr. Bir kod
kesiminin tekrarlanmas istenen bir durum deildir. nk kodun
tekrarlanmas, hem tutarszlklara neden olabilir hem de bakm yaplacak
kod miktarn arttrr. Bunun engellenebilmesi iin, yazlan kodu
kopyalamak yerine, kodun yazld kesimi ilev haline getirip arlmas
dnlebilir.
rneimizde, iki parametreli kurucu tek parametreli kurucunun ieriini
aynen kopyaladktan sonra dakika ile ilgili ksm eklemi, parametreli
kurucu ise iki parametreli kurucunun ieriini aynen kopyalayp saniye ile
ilgili ksm eklemitir. yleyse iki parametreli kurucuda bir parametreli
kurucuyu, parametreli kurucuda da iki parametreli kurucuyu
arabilirsek kod tekrarndan kurtulabiliriz.
Bunu yapabilmek iin this anahtar szc kullanlr. this anahtar
szc, nesnenin kendisine referans olduu gibi, uygun parametreli
kurucunun da iletilmesini salayabilir:
class Zaman {

int saat;
int dakika;
int saniye;

Zaman(int saat) {
if (saat >= 0 && saat < 24) {
this.saat = saat;
}
}
Zaman(int saat, int dakika) {
this(saat);
if (dakika >= 0 && dakika < 60) {
this.dakika = dakika;
}
}
Zaman(int saat, int dakika, int saniye) {
this(saat, dakika);
if (saniye >= 0 && saniye < 60) {
this.saniye = saniye;
}
}
}
Kod 5-13. this anahtar szc ile kurucularn arlmas
Burada dikkat edilmesi gereken nokta, this() ile kurucu aran kod
kesiminin, iinde bulunduu kurucunun ilk deyimi olmas zorunluluudur.
Eer this() ilk deyim olarak yazlmazsa, derleyici hata verecektir.
5.2.8 Yntem Ar Ykleme (Method Overloading)
Kurucularda olduu gibi yntemler de ar yklenebilir.Ayn adl birden
fazla yntem, parametre listelerindeki farkllklar sayesinde birbirlerinden
ayrlabilir. Parametre sayslarnn ya da trlerinin farkl olmas yeterlidir.
Ancak burada akla gelebilecek bir baka soru var: Birden fazla kurucu
yazmak istediimizde ar ykleme kanlmaz, nk kurucular snf ile
ayn ad tamak zorunda. Peki sradan yntemler iin neden ayn ad
kullanalm ki? Yntemlere istediimiz gibi isim verebileceimize gre ar
yklemeye neden gerek olsun?
Bu soruyu yantlamak iin nce programn kaynak kodlarnn yalnzca o
kodu okuyan insanlar iin anlaml olduunu hatrlayalm. Derleyici ya da
JVM asndan, bir yntemin adnn xyztysdf olmas ile zamaniYaz olmas
arasnda herhangi bir fark yoktur. Ancak biz insanlar iin yntem adlar,
yntemin ne i yaptn anlatmalar bakmndan nemlidir. Bir yntemi
adlandrrken o yntemin yapt ii zetleyecek bir ad seer, bylece
kodun okunurluunu arttrmay ve programlamann da daha kolay olmasn
salamaya alrz. Eer ayn ii farkl ekillerde gerekletiren ya da farkl
parametre listeleri ile alarak ayn ii gerekletiren yntemler yazmak
istiyorsak, bu yntemlerin herbiri iin ayr adlar belirlemek yerine, yaplan
ii zetleyen tek bir ad kullanmak hem daha kolay hem daha anlamldr.
Yntem ar yklemenin getirisi programcya bu kolayl salamasndan
ibarettir. Bununla birlikte, programc istiyorsa hala her yntemine farkl ad
vermekte de zgrdr.
Zaman snfmzn ilerle yntemini ar ykleyelim. Daha nce yazdmz
ilerle yntemi, her arldnda zaman bir saniye ilerletiyordu. imdi
bir de zaman verilen saniye kadar ilerleten yntem kodlayalm:
/**
* Verilen saniye kadar zaman ilerletir
*
* @param sn Zamann ka saniye ilerletilecei
*/
void ilerle(int sn) {
saniye += sn;
if (saniye > 59) {
dakika += saniye / 60;
saniye %= 60;
if (dakika > 59) {
saat += dakika / 60;
dakika %= 60;
if (saat > 23) {
saat %= 24;
}
}
}
}
Kod 5-14. Zaman verilen saniye kadar ilerleten yntem
Ve programmz da ar yklenmi kurucular ve yntemleri kullanacak
ekilde deitirelim.
class Program {

public static void main(String[] args) {
Zaman zaman1 = new Zaman();
Zaman zaman2 = new Zaman(14, 12, 34);

zaman1.ilerle(12136);
zaman1.zamaniYaz();

zaman2.ilerle();
zaman2.zamaniYaz();
}
}
Kod 5-15. Zaman snfnn ar yklenmi kurucu ve yntemlerini kullanan
program
Programn kts u ekilde olacaktr:
u anki zaman: 3:22:16
u anki zaman: 14:12:35
kt 5-1. Program snfnn kts
Grld gibi programda iki ayr Zaman nesnesi oluturulmaktadr.
zaman1 adl deiken, ilk nesnenin referansn tutmakta ve bu nesne
parametre almayan kurucu ile oluturulmaktadr. zaman2 ise 3 parametreli
kurucu ile oluturulan nesnenin referansn tutmaktadr. zaman1, 12136
saniye ilerletilip zaman ekrana yazmas istendiinde 3:22:16 deerini
yazm, zaman2 ise 1 saniye ilerletilip ekrana 14:12:35 deerini yazmtr.
Hangi kurucunun ya da hangi ilerle ynteminin alacanda
parametreler belirleyici olmutur.
5.2.9 Diziler
Diziler, ayn trden birok deikeni bir arada tanmlamay ve ynetmeyi
salayan programlama aralardr. Tek bir tanmla birok deiken
tanmlanr ve bunlarn herbirine eriim iin ayn isim bir indisle birlikte
kullanlr. Dizi elemanlarna ayn isim zerinden indis kullanlarak
eriilebilmesi, bu elemanlarn bellekte ardk olarak tutulmasyla
salanmaktadr. rnein 100 elemanl bir tamsay (int) dizisi
oluturulduunda, herbir tamsay elemann uzunluunun 4 byte (32 ikil)
olduu dnlrse, 4 x 100 = 400 byte uzunluunda bir bellek blou
ayrlm demektir.
Dizilerle alrken, diziyi gsteren deikeni, dizinin kendisini, dizinin
elemanlarn ve varsa o elemanlarn gsterdikleri nesneleri birbirlerinden
ayrabilmek nemlidir.
Bir diziyi gsteren deikenin tanm u ekilde yaplr:
dizinin_elemanlarnn_tr[] dizininAdi;
rnek:
int[] tamsayiDizisi;
Zaman[] zamanDizisi;
Bu tanm yapldnda, henz ortada dizi yoktur, bellekte dizi iin ayrlm
yer yoktur. Sadece, bellekte bir dizi oluturulduunda, o dizinin bulunduu
adresi (dizinin referansn) tutabilecek byklkte (4 byte 32 ikil) bir
deiken tanm yaplmtr. Bu tanmn, mantksal olarak
Zaman zamanNesnesi;
tanmndan bir fark yoktur. Her iki tanmlama da referans trden bir
deiken tanmdr. Dizi referans tanmlandnda henz bellekte bir dizi
oluturulmam, nesne referans tanmlandnda da henz bellekte bir
nesne oluturulmamtr.
Dizi,
tamsayiDizisi = new int[100];
zamanDizisi = new Zaman[50];
eklinde dizinin ka elemanl olduu belirtilerek oluturulur. Dikkat edilirse
dizi oluturulurken new ileci kullanlmtr. Buradan, dizilerin de nesneler
gibi ele alndklar ve ynda oluturulduklar sonucunu kartabiliriz.
Bir dizi oluturulduunda, dizinin tanml olduu elemann trnden,
dizinin boyu kadar deiken tanmlanm demektir. Yani yukardaki dizi
tanmlarn dnrsek;
new int[100];
yazmakla
int sayi1;
int sayi2;
int sayi3;
....
eklinde 100 adet tamsay deiken tanmlamak arasnda mantksal adan
bir fark yoktur. yleyse, dizinin herbir elemannn tamsay deiken
olduunu dnebiliriz. Tek fark, bu deikenlere ayr birer isimle deil,
dizi referans ve bir indis deeri kullanlarak eriiliyor olmasdr.
Dizi elemanlarna eriim u ekilde gerekletirilir:
tamsayiDizisi[0] = 5;
tamsayiDizisi[99] = -12;
Javada dizi indisleri 0 (sfr)dan balar. Dizinin ilk eleman 0 indisli
elemandr. Dolaysyla dizinin son eleman da (diziboyu 1) indisli eleman
olacaktr (100 elemanl dizinin son eleman 99 indisli elemandr).
Bir dizinin uzunluu, dizinin length nitelii kullanlarak renilebilir:
int dizininUzunlugu = tamsayiDizisi.length;
Bu bilgiler nda, tamsayi dizisini tanmlayp elemanlarna sradan deer
atayan bir rnek kod kesimini u ekilde yazabiliriz:
int dizi[];
dizi = new int[100];
for (int i = 0; i < dizi.length; ++i) {
dizi[i] = i + 1;
}
Kod 5-16. Dizi elemanlarna eriim rnei - 1
Eer dizi referans deikenini tanmlamak ve diziyi oluturmak iin yazlan
kodlar tek satrda birletirirsek, u kodu elde ederiz:
int dizi[] = new int[100];
for (int i = 0; i < dizi.length; ++i) {
dizi[i] = i + 1;
}
Kod 5-17.Dizi elemanlarna eriim rnei 2
imdi bir soru soralm:
Zaman zamanDizisi = new Zaman[50];
tanmlamas yapld zaman, bellekte ka tane Zaman nesnesi
oluturulmu olur? Yant 0 (sfr). nk bu tanmlama;
nce bellekte 4 byte uzunluunda bir yer ayryor ve bu yere
zamanDizisi adn veriyor (dizi referans deikeni).
50 adet, herbiri Zaman tipinde bir nesnenin adresini tutabilecek
uzunlukta (4 byte) referans deiken iin bellekten yer alyor: 50 x 4
= 200 byte.
Alnan bu yerin adresini zamanDizisi adl deikenin iine
kopyalyor.
Dikkat edilirse henz hi Zaman nesnesi oluturulmad (kodun hibir
yerinde new Zaman() gibi, kurucunun arlmasn salayacak bir
kod yok). zamanDizisi adl referansla ulalan bellek adresinde ise
herbirinin deeri null olan 50 tane referans deiken arka arkaya
duruyor.
Bunu aadaki ekille aklamaya alalm:

ekil 5-2. Diziler ve bellekteki durum
ok Boyutlu Diziler:
Diziler birden fazla boyutlu olabilir. rnein bir matrisi ifade etmek zere
iki boyutlu dizi tanmlanabilir.
int matris[][];
matris = new int[5][10];
Bu tanmlama, 5 satr olan, her satrnda 10 stn bulunan bir matris
oluturmaktadr ve u ekilde de yazlabilir:
int matris[][] = new int[5][10];
Matrisin elemanlarna eriim iin iki indis kullanlr (idisler her boyut iin 0
(sfr)dan balar). Aadaki kod kesimi matrisin ilk satrnn ilk stununa
3, son satrnn son stununa ise 5 deerini aktarmaktadr.
matris[0][0] = 3;
matris[4][9] = 5;
ok boyutlu dizilerin her boyutu, ayr ayr da oluturulabilir. Bu durumda,
her satrnda farkl sayda stun olan iki boyutlu bir dizi u ekilde
oluturulabilir:
int ikiBoyutluDizi[][] = new int[5][];
ikiBoyutluDizi[0] = new int[5];
ikiBoyutluDizi[1] = new int[10];
ikiBoyutluDizi[2] = new int[15];
ikiBoyutluDizi[3] = new int[20];
ikiBoyutluDizi[4] = new int[25];
Yukardaki kod kesiminde, iki boyutlu bir dizi oluturulmaktadr. lk boyutu
5 elemanldr. kinci boyutundaki eleman saylar ise farkldr. Sonuta
oluan veri yaps ekildeki gibidir:

ekil 5-3. ki boyutlu dizi
5.3 Sarmalama (Encapsulation) lkesi ve Eriim
Dzenleyiciler (Access Modifiers)
Nesneye ynelik programlama yaklam ile uygulama gelitirilirken bir
takm ilkelere gre davranlr. Bu ilkeler kodun deitirilebilirlik, yeniden
kullanlabilirlik ve geniletilebilirlik gibi kalite kriterlerinin salanmasnda
ok nemli role sahiptirler.
NYPnin 3 temel ilkesi/arac vardr. Bunlardan ilki kodun deitirilebilirliini
salamakta byk katks olan sarmalama (encapsulation) ilkesidir.
5.3.1 Sarmalama lkesi
Bir snfn iindeki niteliklerin, programn almas srasnda nesnelerin
durumlarn oluturduunu grdk. Bir nesnenin durumunun ise her
zaman anlaml ve tutarl olmak zorunda olduunu syledik. Nesne ilk
oluturulduu anda nesnenin ilk durumunu anlaml klabilmek iin de
kuruculardan faydalandk.
Zaman rneimizde, herhangi bir Zaman nesnesinin durumunun anlamsz
(saat niteliinin 0dan kk ya da 23ten byk, dakika ve saniye
niteliklerinin ise 0dan kk ya da 59dan byk) olamayacan biliyoruz.
nk bu niteliklerin deerleri kurucu ile 0 ya da baka anlaml deerlere
atandktan sonra, ilerle yntemleri ile denetimli bir ekilde
deitiriliyorlar. Bu yntemler kullanld srece nitelikler hibir zaman
belirlenen aralklarn dnda deerlere sahip olamazlar.
Ancak eer Zaman snfnn dndaki herhangi bir kod kesiminde bu
niteliklere eriim olanakl ise bu sylediklerimiz geerliliini kaybedebilir.
Zaman snfnn dndaki herhangi bir kod kesimi, Zaman snfn
balatan ve bitiren { ve } iaretleri arasna yazlmam olan kod kesimi
anlamna gelmektedir.
niteliklere eriim ise kod kesiminde niteliin adn yazarak kodlama
yapmak anlamna gelmektedir. rnein Kod 5-18de zaman adl nesnenin
saat niteliine zaman.saat yazlarak eriilmektedir.
rnein Program snfnn kodunu u ekilde deitirelim:
class Program {
public static void main(String[] args) {
Zaman zaman = new Zaman();
zaman.saat = 25;
zaman.dakika = 62;
zaman.saniye = -5;
zaman.zamaniYaz();
}
}
Kod 5-18. Zaman snf dndan niteliklere eriim
Program snf altrldnda aadaki kt oluur:
u anki zaman: 25:62:-5
Grld gibi eer Zaman snfndan bir nesnenin niteliklerine, snfn iine
tanmlanm olan yntemler dnda eriilip deer atanabilirse bu
niteliklerin deerleri zerindeki denetim ortadan kalkm olur. Baka bir
deyile, eer bir snfa ait nesnelerin niteliklerinin anlaml ve tutarl
deerlerde kalmalarn istiyorsak, bu niteliklerin deerlerini
deitirebilecek kod kesimlerinin mutlaka denetimli olmasn salamak
zorundayz. Bu ise ancak niteliklerin deerlerini deitirmek isteyen kod
kesimlerinin, nesnenin ait olduu snfn iine kodlanm yntemleri
kullanmalarn zorlayarak yaplabilir. rnein, Zaman snfndan bir
nesnenin niteliklerinin deerlerini deitirebilecek btn yntemlerin
Zaman snf iine kodlanmas, bu snfn dnda kalan kod kesimlerinde ise
(rnein Program snf) ancak ve ancak bu yntemlerin kullanlmasnn
zorlanmas gerekmektedir.
Bylece Zaman snfnn nitelikleri yalnzca kurucular ve ilerle yntemleri
ile deitirilebilir ve bu yntemlerin iinde de niteliklerin deerlerinin
anlaml olacaklar garanti edilmektedir.
Sarmalama ilkesi, bir snfa ait niteliklerin deerlerinin ancak o
snfn iine kodlanm yntemler tarafndan deitirilebilmesi ve
okunabilmesi ilkesidir. Bylece nesnelerin durumlar her zaman
anlaml kalabilir.
Ayrca niteliklere snf dndan eriimin olmamas, bir snf iindeki
niteliklerin nasl ve ka adet olacann da baka kod kesimlerinden
saklanm olmas anlamna gelir. Bu durumda snfn iindeki kodlar baka
snflar etkilenmeden deitirilebilir. Bunu bir rnekle aklayalm:
Zaman snfndaki niteliklerin dier kod kesimlerinden eriilebilmesini kesin
olarak engelleyebilirsek, Zaman snfnn iinde hangi niteliklerin
bulunduunun uygulamann geri kalan ksm iin bir nemi kalmaz.
rnein, Zaman snf iinde saat, dakika ve saniye olarak 3 adet nitelik
tutmak yerine, yalnzca saniye niteliini tutup gerekli olduunda
hesaplama yaparak dakika ve saat deerlerine ulaabiliriz. Zaman snfna
ait nesneler kullanan Program snf, Zaman snfnn kurucu, ilerle ve
zamaniYaz yntemlerini kullanmakta olduundan, gene ayn ekilde
alacaktr. Zaman snfnn iinde yaplan deiiklikler hibir ekilde
Program snfn etkilememi olacaktr. Aada bu durumu rnekleyen
kodlar grlmektedir.
class Zaman {

int saniye;

/**
* Nesnenin ilk durumunu 0, 0, 0 yapar.
*/
Zaman() {
saniye = 0;
}

/**
* Nesnenin ilk durumunu verilen deerlere eker
*
* @param st Saat iin balang deeri
* @param dk Dakika iin balang deeri
* @param sn Saniye iin balang deeri
*/
Zaman(int st, int dk, int sn) {
if (st >= 0 && st < 24) {
saniye += st * 60 * 60;
}
if (dk >= 0 && dk < 60) {
saniye += dk * 60;
}
if (sn >= 0 && sn < 60) {
saniye += sn;
}
}

/**
* Her arldnda nesneyi bir saniye sonrasna gtrr.
* saniye 59, dakika 59, saat ise 23'ten byk olamaz.
*/
void ilerle() {
saniye++;
}
/**
* Verilen saniye kadar zaman ilerletir
*
* @param sn Zamann ka saniye ilerletilecei
*/
void ilerle(int sn) {
saniye += sn;
if (saniye < 0) {
saniye = 0;
}
}
/**
* arld zaman nesnenin o anki durumunu ekrana yazar.
*/
void zamaniYaz() {
int saat = saniye / (60 * 60);
int dakika = (saniye / 60) % 60;

System.out.println("u anki zaman: " +
saat + ":" + dakika + ":" + (saniye % 60));
}
}
Kod 5-19. Deitirilmi Zaman snf
class Program {
public static void main(String[] args) {
Zaman zaman1 = new Zaman();
Zaman zaman2 = new Zaman(14, 12, 34);

zaman1.ilerle(12136);
zaman1.zamaniYaz();

zaman2.ilerle();
zaman2.zamaniYaz();
}
}
Kod 5-20. Deitirilmi Zaman snfn kullanan Program snf
u anki zaman: 3:22:16
u anki zaman: 14:12:35
kt 5-2. Program snfnn kts
Kod 5-19da, Zaman snfndaki dakika ve saat niteliklerinin silinerek
yalnzca saniye niteliinin kald grlmektedir. Zaman snfnn
yntemleri de yalnzca saniye nitelii ile alacak ekilde deitirilmi
durumdadr. Kod 5-20deki Program snfnda ise hibir deiiklik
yaplmamtr (Kod 5-15 ile ayndr) ve kt 5-2de grlen kt, kt 5-
1deki ile ayndr.
Sarmalama ilkesi kodun deitirilebilirliini salar ve bakmn kolaylatrr.
5.3.2 Paket Kavram
Eriim dzenleyicilerden hemen nce paket kavramn anlatmamz
gerekiyor. Bylece eriim dzenleyicilerden bahsederken, paket eriimini
belirleyen dzenleyiciyi de aklayabileceiz.
nce bir snf nasl adlandrdmz dnelim: genellikle, snfn ilikili
olduu kavramn adn kullanyor, ilgisiz adlandrmalardan kanarak kodun
okunurluunu salamaya zen gsteriyoruz. rnein zaman ifade etmek
zere tasarladmz snfn adn Zaman setik. Bir renci ynetim sistemi
gelitiriyor olsaydk, byk olaslkla snf adlarmz Ogrenci, Ders,
Ogretmen.. gibi adlar olacakt.
Java ile programlama yapan herkesin ayn yaklam benimsediini
dnrsek, benzer kavramlar karlamak zere benzer isimler
kullanlacan grrrz. Bu durumda, dnyann heryerinde ayn snf
isimleri kullanlyor olabilir.
Gelitireceimiz uygulamalar kanlmaz olarak Java ktphanelerinden
faydalanacaktr. Bu ktphaneler ise baka baka insanlar tarafndan
gelitirilmektedir ve ou zaman benzer ya da ayn ii yapmak zere
birok seenek bulunmaktadr. Her Java ktphanesinde birok snf
bulunduu dnlrse, bir uygulama gelitirilirken ayn adl birok snf ile
karlamann olas olduu grlr. rnein eer ngilizce dilini kullanarak
kod gelitiriyorsak ve tarih bilgisini yneten bir snf yazarsak, snfn adn
byk olaslkla Date olarak seeriz. Java API de Date isimli bir snf
iermektedir. Peki bu durumda hangi Date snfnn bizim yazdmz snf,
hangisinin Java APIdeki snf olduunun ayrmn nasl yapacaz? Daha
genel bir ifadeyle, birok insan kod gelitirir ve byk olaslkla ayn snf
adlarn kullanr durumdayken, bu snflar birbirlerine kartrmadan nasl
kullanlabilir?
te burada paket kavram devreye giriyor. Paket, her snfn adnn biricik
(tek) olmasn salayan bir programlama aracdr. Farkl paketlerde
bulunan snflar, adlar ayn olsa bile birbirlerinden paket adlar kullanlarak
ayrlrlar. rnein Java APIdeki Date snf java.util adl bir pakette
bulunmaktadr ve tam ad java.util.Datedir. Bizim yazacamz snfn
paket adn farkl sememiz durumda, ayn ad kulland halde dier snf
ile karmayan bir snf kodlam oluruz.
Paketler, disk zerindeki klasrlere karlk gelirler ve iie klasr yaps
oluturacak ekilde paket adlar tanmlanabilir. Yani rnein Zaman snfn
kitap.java.ornekler.zamanornegi adl bir paketin iine koymak iin,
aadaki klasr yapsnn oluturulmas ve Zaman snfnn zamanornegi
adl klasrn iinde bulunmas gerekir:

ekil 5-4. Paket ve klasr yaps
Bir snfn paket adn belirlemek iin ise, snf tanmnn bana paket
adnn yazlmas gerekir. Bunun iin package anahtar szc,
kendisinden sonra paketin ad gelecek ekilde kullanlr:
package paketadi;
Aada, Zaman snfnn kitap.java.ornekler.zamanornegi paketine
nasl koyulduu grlmektedir:
package kitap.java.ornekler.zamanornegi;

public class Zaman {
....
}
Kod 5-21. Paket tanmlama
simlendirme gelenei:
Paket ad verilirken, paket adnda bulunan herhangi bir ksm birden fazla
szck ieriyorsa, szckler bitiik ve tamam kk harfle yazlr!
rnek: kitap.java.ornekler.zamanornegi adl pakette, zamanornegi ksm
zamanOrnegi ya da zaman_ornegi eklinde deil zamanornegi eklinde
yazlmtr.
Farkl paketlerdeki snflara erime:
Bir paketin iinde bulunan snfn kullanlabilmesi iin snfn tam adnn
(paket ad ile birlikte snf adnn) kullanlmas gerekir. Ancak ayn paket
iinde bulunan snflar birbirlerine paket ad kullanmadan da eriebilirler.
rnein, Program snfn da Zaman snf ile ayn pakete koyarsak, Program
snfnn iinde Zaman snfn kullanmak iin paket adn kullanmamz
gerekmez:
package kitap.java.ornekler.zamanornegi;

public class Program {
public static void main(String[] args) {
Zaman zaman1 = new Zaman();
....
}
}
Kod 5-22. Ayn paketteki snfa eriim
Eer Program snf Zaman snf ile ayne pakette deilse, Zaman snfna
eriebilmek iin iki yol vardr:
1- Zaman snfnn tam ad kullanlr:
package kitap.java.ornekler;
public class Program {
public static void main(String[] args) {
kitap.java.ornekler.zamanornegi.Zaman zaman1 =
new kitap.java.ornekler.zamanornegi.Zaman();
.....
}
}
Kod 5-23. Farkl paketteki snfa eriim - 1
2 import deyimini kullanlr: import deyimini kullanan snf iinde,
baka bir paketteki snf(lar) kullanlabilir. import, JVMye, o snf iinde
ad geen snflarn hangi paketlerde aranmas gerektiini bildiren bir
deyimdir:
package kitap.java.ornekler;
import kitap.java.ornekler.zamanornegi.Zaman;
public class Program {
public static void main(String[] args) {
Zaman zaman1 = new Zaman();
....
}
}
Kod 5-24. Farkl paketteki snfa eriim - 2
Grld gibi import deyimi kullanldnda Zaman snfnn tam adnn
kullanlmas gerekmez. Dolaysyla eer Zaman snf kodun ok yerinde
geiyorsa, her seferinde tam ad yazmamak iin snf tanmnn stne
import deyimi yazlarak kodlama kolaylatrlr.
Bir paketin iindeki snflardan birden fazlas kullanlmak isteniyorsa,
import paket1.sinif1;
import paket1.sinif2;
import paket1.sinif3;
....
eklinde birden fazla satr yazlabilir. Ancak ayn paket iindeki birok snf
tek tek yazmak yerine,
import paket1.*;
yazlarak o paketteki btn snflarn bu snfn kodu iinde kullanlmas
salanabilir. Bylece tek bir deyimle, birok satr kodlamaktan kurtulmak
olanakldr.
Paket adlarnn verilmesi:
Biricik snf adlarnn oluturulabilmesi iin paket adlarnn da biricik
olmalar gerekmektedir. Bunun salanabilmesi iin genelde her kurum
kendi alan adn (web adresinde kullanlan ad) kullanr. nk alan
adlarnn dnyada biricik olduklar garanti olduuna gre, alan adlar
kullanlarak oluturulan paket adlar da biricik olacaktr. rnein Hacettepe
niversitesi Bilgisayar Mhendisilii Blmnn alan ad
cs.hacettepe.edu.trdir ve bu ad dnya genelinde biriciktir.
Paket ad oluturulurken alan ad ters evrilerek yazlr. Bylece ayn
kurumun oluturduu btn paketler ayn hiyeraride saklanm olur.
rnein, H.. Bilgisayar Mhendislii Blmnn Bil132 dersinde
gelitirilen 1. projenin altndaki btn paketler,
tr.edu.hacettepe.cs.bil132.proje1
adl bir paketin altnda toplanabilir. Daha alt dzeydeki adlandrma ise
snflar arasndaki ilikiler ve modelin ayrntlarna bal olarak yaplabilir.
Hangi snflar hangi paketlere:
Bir snfn hangi pakete koyulacana programc ya da o programcnn
alt kurumun standatlar karar verir. Ancak genel eilim, birbiri ile
yakn iliki iinde bulunan snflarn bir arada toplanmasn salayacak
ekilde ayn pakete koyulmalar, pakete de o paketteki snflarn bir arada
hangi ii yaptklarn belirten bir isim vermek ynndedir.
5.3.3 Eriim Dzenleyiciler
Sarmalama ilkesi bir snf iindeki niteliklere o snf dndan dorudan
eriilmesinin engellenerek, eriimin o snfn iine kodlanm yntemler
arlarak gerekletirilmesini sylemektedir. yleyse, bir snfn belirlenen
elerine eriimi dzenleyecek programlama dili aralarna gereksinim
vardr.
Eriim dzenleyiciler, nne yazldklar nitelik, yntem ya da snfn
eriilebilecekleri alan belirleyen ayrlm szcklerdir.
private: nne yazld genin yalnzca o snf iinde dorudan eriilebilir,
o snfn dndaki kod kesimlerinden dorudan eriilemez olmasn salar.
Sarmalama ilkesi gerei, niteliklerin yalnzca snf iinden dorudan
eriilebilir olmalar gerekmektedir. Bu nedenle genel olarak nitelikler
private eriim dzenleyicisi ile tanmlanr. Bunun yansra, yalnzca snf
iinden arlabilir olmas istenen (rnein snfa zel baz hesaplamalar
yapmak iin kodlanan) yntemler de private olarak tanmlanabilir.
public: nne yazld genin yalnzca o snf iinde deil, o snfn
dnda kalan btn kod kesimlerinden de dorudan eriilebilir olmasn
salar. Snfa ait nesnelerin, dier nesneler tarafndan arlabilmesi
istenen yntemleri public eriim dzenleyicisi ile tanmlanr.
protected: private ve public eriim dzenleyicilerinin arasnda bir
eriim alan tanmlar. protected tanmlanan ge, kendisi ile ayn pakette
bulunan kod kesimlerinden dorudan eriilebilir. Ayrca kaltm konusu
anlatlrken belirtilecei gibi protected tanmlanm geler, alt snftan da
dorudan eriilebilen gelerdir.
Eer bir programlama gesinin nne herhangi bir eriim dzenleyici
yazlmazsa, o genin eriimi iinde bulunduu paketle snrlandrlmtr.
Yani ayn pakette bulunan snflarn iinden o geye dorudan
eriilebilirken, baka paketlerden eriilemez (Zaman ve Program snflarna
eriim dzenleyicileri yazmadan nce, btn nitelik ve yntemler paket
eriim kurallar ile alyordu. Hepsi ayn pakette olduu iin yazdmz
kodlar sorunsuz alyordu).
5.3.4 get/set Yntemleri
Sarmalama ilkesi gerei snfn niteliklerini private tanmladk. Bylece
snfn dnda kalan herhangi bir kod kesiminde bu niteliklerin dorudan
kullanlmasn engellemi olduk. Ancak bu engelleme ayn zamanda
niteliklerin deerlerinin kurulmasn ve sorgulanmasn da engeller.
rnein, u ana kadar Zaman snfmzda kurucular, ilerle yntemleri ve
zamaniYaz yntemi tanml. Fakat herhangi bir anda baka bir nesne
tarafndan saatin (tek bana saat niteliinin) ka olduunun
sorulabilmesi ya da Zaman nesnesi oluturulduktan sonra zamann
(rnein 16:54:23 anna) ayarlanmas olanakl deil. Baka bir deyile,
zaman ayarlamak ya da renmek iin (zamaniYaz yntemi yalnzca
zaman ekrana yazdryor, baka bir nesnenin zaman renmesini
salamyor) baka yntemlere gereksinimimiz var.
Javada niteliklerin deerlerini sorgulayan yntemlere genel olarak get
yntemleri, niteliklerin deerlerini kuran yntemlere set yntemleri
(getter and setter methods, accessors) ad verilir.
get ve set yntemlerinin adlandrlmas: get ya da set
szcnden hemen sonra deeri sorgulanacak ya da kurulacak niteliin
ad ilk harfi bytlerek yazlr. rnein saat niteliinin deerini
sorgulayan get yntemi getSaat, deerini kuracak set yntemi ise
setSaat eklinde adlandrlr.
get/set yntemlerinin btn nitelikler iin yazlmas zorunlu deildir.
rnein Zaman snfnda, eer nesne bir kez oluturulduktan sonra
zamann yalnzca ilerletilebilmesini istiyor, niteliklerin deerlerinin baka
hibir ekilde deimemesini istiyorsak, Zaman snfna set yntemi
yazmayz. Benzer ekilde eer herhangi bir niteliin deerinin baka bir
nesne tarafndan renilmesini istemiyorsak get yntemi yazmayabiliriz.
Hangi yntemlerin yazlaca programcnn tasarmna baldr.
Biz imdi Zaman snfmz iin eriim dzenleyicileri de kullanarak get ve
set yntemlerini rnekleyelim:
public class Zaman {

private int saat;
private int dakika;
private int saniye;

public Zaman() {
saat = 0;
dakika = 0;
saniye = 0;
}

public Zaman(int st, int dk, int sn) {
setSaat(st);
setDakika(dk);
setSaniye(sn);
}

public void ilerle() {
saniye++;
}

public void ilerle(int sn) {
saniye += sn;
if (saniye > 59) {
dakika += saniye / 60;
saniye %= 60;
if (dakika > 59) {
saat += dakika / 60;
dakika %= 60;
if (saat > 23) {
saat %= 24;
}
}
}
}

public void zamaniYaz() {
System.out.println("u anki zaman: " +
saat + ":" + dakika + ":" + (saniye % 60));
}

public int getSaat() {
return saat;
}

public void setSaat(int st) {
if (st >= 0 && st < 60) {
saat = st;
}
}

public int getDakika() {
return dakika;
}

public void setDakika(int dk) {
if (dk >= 0 && dk < 60) {
dakika = dk;
}
}

public int getSaniye() {
return saniye;
}

public void setSaniye(int sn) {
if (sn >= 0 && sn < 60) {
saniye = sn;
}
}
}
Kod 5-25. Eriim dzenleyiciler ve get/set yntemleri ile Zaman snf
Dikkat ederseniz Zaman snfnn btn niteliklerini private, yntemlerini
ise public tanmladk. Kurucularn public olmas, bu kurucularn baka
snflar iinde kullanlarak Zaman snfna ait nesnelerin oluturulabilmesini
salar. rnein eer parametre almayan Zaman() kurucusunu private
tanmlarsak, Program snfnn iindeki Zaman zaman1 = new Zaman();
satr derleme hatas alacaktr. nk Program snf Zaman snfnn dnda
kalan bir kod kesimidir ve parametre almayan kurucu private
tanmlanmtr.
Kod 7-15te Zaman snfnn kendisi de public tanmlanmtr. Hatrlarsanz
bir dosyay, iine yazdmz snfn ad ile kaydediyorduk. Bir dosyann
iinde yalnzca bir snf bulunmas gibi bir zorunluluk bulunmamakla
birlikte en fazla bir tane public tanmlanm snf bulunmas zorunluluu
vardr. Bu u anlama gelir: Bir dosyann iine yalnzca bir tanesi public
olmak art ile birden fazla snf tanmlanabilir. Dier snflarn nne
herhangi bir eriim dzenleyici yazlmaz (package access). Dosya da
public olan snfn ad ile kaydedilmek zorundadr. public olmayan snflar
ise ancak o snflarla ayn pakette olan snflar tarafndan kullanlabilir.
Programlama dillerinin eitli yetenekleri vardr. Bu yeteneklerin var
olmalar, her uygulamada kullanlmalar gerektii anlamna gelmez.
Gelitireceiniz Java programlarnda ok zel durumlar dnda bir dosyann
iine birden fazla snf yazmanz gerekmeyecektir. Dolaysyla bu yetenei
hibir zaman kullanmayabilirsiniz de! Bir dosyann iinde tek bir snf
bulunmas ve o snfn da public tanmlanmas, uygulamalarnzn daha
kolay ynetilebilir olmasn salayacaktr.


5.4 Snf/Nesne Deikenleri ve Yntemleri
u ana kadar, snflarn sadece tanmlar olduunu, new ile bir nesne
oluturulana kadar bellekte fiziksel olarak yer ayrlmadn syledik. Bir
nesne oluturulduktan sonra, snfta tanm yaplan her nitelik iin o
nesneye zel bir kopya oluturulduunu, o nesnenin iindeki herbir nitelik
iin ayr ayr yer alndn grdk. Bu durumda, eer iki Zaman nesnemiz
varsa, her nesnenin iinde birer tane olmak zere toplamda ikier tane,
birbirinden bamsz bellek alanlarnda saklanan saat, dakika ve saniye
niteliklerimiz vardr.
Her nesne, ait olduu snfa ait nitelikler iin kendi iinde birer kopya
bulundurmaktadr. Bu niteliklere olgu deikenleri (instance
variables) de denir. Olgu, nesneye karlk gelir. Snfn bir olgusunun
oluturulmas bir nesne oluturulmas anlamna gelmektedir. Her nesne
iin ayr ayr oluturulan niteliklere de o olgunun deikenleri ad verilir.
Benzer ekilde, snf iinde tanmladmz yntemleri nesne referanslar
zerinden arrz. Oluturulan nesnenin adresini tutan referans deikeni
kullanlarak yntemin ad verilir ve o yntem, hangi nesne zerinden
arlmsa o nesnenin nitelikleriyle, baka bir deyile o olgunun
deikenleri ile alr. Bylece iki farkl Zaman nesnesine ait referanslar
zerinden zamaniGoster() yntemini ardmzda ekranda iki farkl
zaman yazdn grrz:
public static void main(String[] args) {
Zaman zaman1 = new Zaman();
Zaman zaman2 = new Zaman(14, 12, 34);

zaman1.ilerle(12136);
zaman1.zamaniYaz();

zaman2.ilerle();
zaman2.zamaniYaz();
}
Kod 5-26. Olgu deikenleri ve olgu yntemleri
Yukardaki kod kesiminde Zaman snfna ait iki nesne oluturuluyor ve bu
nesnelerin referanslar zaman1 ve zaman2 adl iki referans tipinde
deikende saklanyor. zaman1 nesnesi zerinden ilerle() yntemi
12136 parametresi ile arldnda, zaman1 olgusuna ait deikenlerin
deerleri deiiyor. zaman1.zamaniYaz() yntemi ile bu deikenlerin
deerleri ekrana yazdrlyor.
zaman2 olgusu zerinden ise parametresiz ilerle() yntemi arlyor.
Bu yntem, zerinden arld referans ile gsterilen olguya ait olan
deikenler zerinde ilem yapyor. zaman2.zamaniYaz() yntemi, bu
olgunun deikenlerinin deerlerini yazyor. Bylece ktda iki farkl
zaman deeri gryoruz:
u anki zaman: 3:22:16
u anki zaman: 14:12:35
kt 5-3. Olgu deikenleri ve olgu yntemleri
Bu durum aadaki ekille daha net anlalabilir:

ekil 5-5. Olgu deikenleri ve olgu yntemleri
Olgu deikenlerinden baka, herhangi bir olguya deil, snfa ait olan
deikenler de tanmlanabilir. Bunlara snf deikenleri denir. Ayn ekilde,
bir nesne referans yerine, snf ad zerinden arlabilen yntemler de
yazlabilir, bunlara da snf yntemleri ad verilir.
5.4.1 static anahtar szc
static anahtar szc, snf deikenlerini ya da snf yntemlerini
tanmlamak iin kullanlr.
Eer bir snfn niteliklerinden bir ya da birkann nne static yazlrsa,
o nitelik(ler) snf deikeni olur. Snf deikenlerinin iki nemli zellii
vardr:
1. Snf deikeni olarak tanmlanan nitelikler, her nesne iin ayr ayr
oluturulmazlar. Snfa ait ka nesne olursa olsun snf deikeni 1
tanedir. Hangi nesne zerinden eriilirse eriilsin bu deikene
eriilecektir.
2. Snf deikenleri, hi nesne oluturulmasa da bellekte yer kaplarlar.
Eer bir snfn yntemlerinden bir ya da birkann nne static yazlrsa,
o yntem(ler) snf yntemi olur. Snf yntemlerinin nemli bir zellii
vardr:
o Snf ynteminin arlabilmesi iin o snfa ait nesne oluturulmas
gerekmez. Snf yntemine snf ad zerinden ulalabilir.
imdi bu bilgileri rnekleyen basit bir kod yazalm:
public class A {
private int olguDegiskeni;
private static int sinifDegiskeni;

public int getOlguDegiskeni() {
return olguDegiskeni;
}
public void olguDegiskenineEkle(int sayi) {
olguDegiskeni += sayi;
}
public static void sinifDegiskenineEkle(int sayi) {
sinifDegiskeni += sayi;
}
public static int getSinifDegiskeni() {
return sinifDegiskeni;
}
}
Kod 5-27. static anahtar szc rnei A snf
public class Program {
public static void main(String[] args) {
A a1 = new A();
a1.olguDegiskenineEkle(5);
System.out.println("a1 - Olgu deikeni: " +
a1.getOlguDegiskeni());

A.sinifDegiskenineEkle(7);
System.out.println("a1 - Snf deikeni: " +
a1.getSinifDegiskeni());
System.out.println("A - Snf deikeni: " +
A.getSinifDegiskeni());

A a2 = new A();
System.out.println("a2 - Snf deikeni: " +
a2.getSinifDegiskeni());
a2.olguDegiskenineEkle(15);
System.out.println("a2 - Olgu deikeni: " +
a2.getOlguDegiskeni());

A.sinifDegiskenineEkle(27);
System.out.println("a2 - Snf deikeni: " +
a2.getSinifDegiskeni());
System.out.println("A - Snf deikeni: " +
A.getSinifDegiskeni());
}
}
Kod 5-28. static anahtar szc rnei Program snf
a1 - Olgu deikeni: 5
a1 - Snf deikeni: 7
A - Snf deikeni: 7
a2 - Snf deikeni: 7
a2 - Olgu deikeni: 15
a2 - Snf deikeni: 34
A - Snf deikeni: 34
kt 5-4. static anahtar szc rnei kt
A snfnn koduna bakalm: bir olgu deikeni, bir de snf deikeni
tanmlanm:
private int olguDegiskeni;
private static int sinifDegiskeni;
Bu deikenlere verilen sayy ekleyen iki yntem tanmlanm:
public void olguDegiskenineEkle(int sayi) {
olguDegiskeni += sayi;
}
public static void sinifDegiskenineEkle(int sayi) {
sinifDegiskeni += sayi;
}
Bu deikenlerin deerlerini sorgulayan iki yntem tanmlanm:
public int getOlguDegiskeni() {
return olguDegiskeni;
}
public static int getSinifDegiskeni() {
return sinifDegiskeni;
}
Dikkat edilirse, snf deikeninin deerini dndren
getSinifDegiskeni() adl yntemin static tanmland grlr. Snf
deikenleri zerinde ilem yapan yntemlerin snf yntemi
olarak (static) tanmlanmalar zorunludur. Bunu yle bir mantksal
ilikiyle aklamaya alalm:
Bir snf deikeninin, henz nesne oluturulmasa da bellekte fiziksel
olarak yer kapladn sylemitik. Bir snf ynteminin ise nesne
oluturulmadan, snf ad zerinden arlabildiini belirttik. Bu durumda,
nesne var olmadan arlabilecek olan snf yntemlerinin, nesne var
olmadan bellekte var olamayan olgu deikenlerine erimesi olanakl
deildir. Benzer ekilde, nesne var olmadan bellekte var olan snf
deikenleri zerinde ilem yapan yntemlerin, nesne var olmadan
arlabilmeleri gerekir. Dolaysyla, snf deikenleri zerinde ilem
yapan yntemler snf yntemleri olmaldr.
te yandan, bir olgu ynteminin snf deikenine erimesi olanakldr.
nk olgu yntemi nesne olutuktan sonra arlacaktr. Daha nesne
olumadan fiziksel olarak bellekte var olan snf deikenine nesne
yntemi ile de eriilebilecei aktr. Bununla birlikte, snf deikenlerine
olgu yntemlerinden eriilmesi terecih edilen bir durum deildir.
rnek koda geri dnelim. Program snfna baktmzda A snfndan iki
ayr nesne oluturulduunu gryoruz. lk nesne, a1 adl referans
deikenle gsteriliyor.
a1.olguDegiskenineEkle(5);
yntem ars ile, a1 nesnesinin olguDegiskeni adl niteliine 5 deeri
ekleniyor. ktnn ilk satrnda bu grlyor:
a1 - Olgu deikeni: 5
Daha sonra A snfnn snf yntemi arlyor:
A.sinifDegiskenineEkle(7);
Snf yntemi, snfDegiskeni adl deikenin deerine 7 ekliyor. Burada
snf ynteminin snf ad ile arlna dikkat edelim. Hemen sonraki
satrda
System.out.println("a1 - Snf deikeni: " + a1.getSinifDegiskeni());
ars ile olgu zerinden snf deikeninin deerine eriiliyor. Bunun
olanakl olduunu ama tercih edilmediini sylemitik. Bu arnn
sonucunda ktda snf deikeninin deeri grlyor:
a1 - Snf deikeni: 7
Hemen sonraki satrda ise snf ad zerinden snf yntemi kullanlarak
snf deikeninin deeri sorgulanp ekrana yazlyor:
System.out.println("A - Snf deikeni: " + A.getSinifDegiskeni());
ktda oluan deer ise olgu deikenininden eriimde grlen deerle
ayn:
A - Snf deikeni: 7
Sonraki iki satrda a2 nesnesi oluturulup, a2 olgusu ile ilgili hibir ilem
yaplmadan snf deikeninin deeri sorgulanyor:
A a2 = new A();
System.out.println("a2 - Snf deikeni: " + a2.getSinifDegiskeni());
ktda ise u satr oluuyor:
a2 - Snf deikeni: 7
a2 olgusu zerinden hibir ilem yaplmad halde snf deikeninin
deeri nceki kt satrlarnda grlenle ayn. Bunun nedeni, btn
olgularn ayn snf deikenine ulayor olmalar. Snf deikeninin
bellekte sadece tek kopyas bulunuyor ve btn olgular ayn deeri
paylayorlar. Dolaysyla herhangi bir olgu zerinden ya da snf ad
zerinden snf deikeninin deeri deitirilirse btn olgular ayn deere
ulayorlar.
Snf deikenleri ne iin kullanlr?
ok kullancl bir oyun program yaptmz dnelim. Her oyuncu kendi
ekrannda o andaki oyuncularn saysn grmek istiyor olsun. Bunu
yapabilmek iin Oyuncu snfnn her nesnesinin, Oyuncu snfna ait
nesnelerin saysna ulaabilmesi gerekir. Eer oyuncu saysn bir olgu
deikeni olarak tanmlarsak, her olgunun kendine ait birer deikeni
olacandan, yeni bir Oyuncu nesnesi oluturulduunda ya da bir oyuncu
oyundan ktnda, her olgudaki oyuncu says deikenini gncellememiz
gerekecektir. Snf deikeninin tek kopyas olduundan, oyuncu saysn
snf deikeni olarak tanmlarsak gncellenmesi gereken tek deer snf
deikeni olur. Btn olgular snf deikenine eriebilecei iin tek ve
merkezi bir noktadan bu bilgiyi yntemi oluruz.
Ksaca, snf deikenleri snfn btn nesneleri iin genel deiken
(global variable) olarak dnlebilirler. Eer verinin tek kopyasna
gereksinim varsa ya da btn nesnelerce paylalmas gereken veriler
varsa, bu tip verilerin snf deikeni olarak tanmlanmalar uygundur.
Aada Oyuncu snfnn kodu grlmektedir:
public class Oyuncu {
private static int oyuncuSayisi;
public Oyuncu() {
Oyuncu.oyuncuSayisi++;
}
public void oyundanCik() {
Oyuncu.oyuncuSayisi--;
}
public static int kacOyuncuVar() {
return Oyuncu.oyuncuSayisi;
}
}
Kod 5-29. Oyunu snf
Aada Oyuncu snfn kullanan rnek bir program grlmektedir:
public class Program {
public static void main(String[] args) {
System.out.println("Oyuncu says: " + Oyuncu.kacOyuncuVar());
Oyuncu o1 = new Oyuncu();
Oyuncu o2 = new Oyuncu();
Oyuncu o3 = new Oyuncu();
System.out.println("Oyuncu says: " + o1.kacOyuncuVar());
o1.oyundanCik();
o3.oyundanCik();
System.out.println("Oyuncu says: " + o2.kacOyuncuVar());
}
}
Kod 5-30. Oyuncu snfn kullanan rnek program
Aadaki ekilde her Oyuncu nesnesi oluturulduunda snf deikeninin
deerinin nasl deitii grlmektedir:

ekil 5-6. Snf deikeninin olgulardan gncellenmesi
Snf yntemleri ne iin kullanlr?
Bazen bir yntemi armak iin nesne oluturmaya gerek yoktur. rnein
karekk bulan bir yntemin herhangi bir nesne zerinden arlmas ok
anlaml deildir. nk karekk hesaplayabilmek iin gereksinim duyulan
tek bilgi hangi saynn karekknn bulunacadr ve bu bilgi ynteme
parametre olarak verilir. Oysa ortada bir nesne varsa, bu nesnenin bir de
durumu vardr ve arlacak yntem ancak bu durum bilgisinden
faydalanacaksa nesnenin varl anlaml olur. Karekk hesaplamak iin
herhangi bir durum bilgisine gereksinim olmadna gre, bu yntemi iine
yazdmz snfn (hereyi bir snfn iine yazmak zorundayz) nesnesini
oluurmak anlaml olmayacaktr. te byle durumlarda, nesne
oluturulmadan arlabilmesini istediimiz yntemleri snf yntemi olarak
tanmlarz. Bylece nesne oluturmadan yntemi armak olanakl hale
gelir.
Java APIde java.lang.Math snfnda tam da bu ii yapan sqrt adl
yntem u ekilde tanmlanmtr:
public static double sqrt(double a)
Java API belgelerinden java.lang paketi iindeki Math snfn incelerseniz,
bu snfn btn yntemlerinin static tanmlandn greceksiniz. Bunun
nedeni, burada tanmlanan yntemlerin, yapacaklar hesaplamalar iin
durum bilgisine gereksinim duymamalardr. Bylece karekk hesaplayp
ekrana yazdrmak iin yapmamz gereken tek ey Math snf zerinden
sqrt yntemini armak olacaktr:
System.out.println(Math.sqrt(25));
5.4.2 main yntemi
Java programlarnn almaya main ynteminden baladn daha nce
sylemitik. Ayrca rneklerimizde de main yntemini kodladk. imdi bu
ynteme daha yakndan bakalm.
public static void main(String[] args) {
....
}
Kod 5-31. main yntemi
Grld gibi, main yntemi public tanmlanmtr, yani snf dndan
eriilebilir. Peki programn balad nokta main ynteminin kendisi ise, bu
ynteme eriecek olan ve snfn dnda yazlm olan kod kesimi
hangisidir? u ana kadar yazdmz rneklerin hibirisinde main yntemini
aran bir kod kesimi yazmadk.
main yntemi static tanmlanmtr. Demek ki, main ynteminin iine
yazld snfn bir nesnesi oluturulmadan da bu yntem arlabilir.
main yntemi parametre olarak String tipinden nesnelerin referanslarn
ieren bir dizi almaktadr. Peki bu parametre nereden gelmektedir?
Eer yazdmz her programn JVM tarafndan iletileceini hatrlarsak, bu
sorular kolayca yantlanm olur: main yntemini JVM arr. JVMnin
bizim yazdmz snfn iindeki yntemi arabilmesi iin bu yntem
public tanmlanmtr. JVMnin bizim yntemimizi armak iin nesne
oluturmas gerekmesin diye yntem static tanmlanmtr. String
dizisini parametre olarak main yntemine veren de gene JVMdir. Bu
parametreyi program altrrken komut satrndan (konsoldan)
verdiimiz deerlerden oluturmaktadr.
Bu durumu aadaki programla aklayalm:
public class Program {
public static void main(String[] args) {
for (int i = 0; i < args.length; ++i) {
System.out.println(args[i]);
}
}
}
Kod 5-32. Komut satrndan verilen parametreleri ekrana yazan program
Bu program komut satrndan parametre vererek altralm:

ekil 5-7. Komut satrndan parametre ile program altrlmas
Grld gibi programmz komut satrndan verilen btn parametreleri
ekrana yazd. Tabi ki gerek bir uygulamada bu parametreler ekrana
yazlmak yerine daha anlaml ilemler yapmak zere kullanlacaklardr.
5.4.3 static kod bloklar
Olgu deikenlerinin ilk deerlerinin verilmesi iin kurucu yntemleri
kullanabiliriz. Ancak snf deikenlerinin ilk deerlerini kurucu iinde
vermeye almak yanl olabilir. nk snf deikenleri, hi nesne
oluturulmam olsa da kullanlabilmektedir. Snf deikenleri ile ilgili
olarak bir defaya zel olmak zere iletilmesi istenen kod kesimleri static
kod bloklarnda kodlanabilir. static kod bloklar, snf bellee yklendii
anda iletilir. Bylece snf deikenleri bellekte oluturulduklar anda ilk
deerlerini alm olurlar.
Bir static kod blou u ekilde kodlanr:
static {
deyim1;
deyim2;
....
deyimN;
}
Kod 5-33. static kod blounun yazl
Aada, static kod blounun kullanln rnekleyen kk bir program
grlmektedir:
package yazarlar;

public class Yazar {
private String ad;
private String soyad;

public Yazar(String ad, String soyad) {
this.ad = ad;
this.soyad = soyad;
}
public String getAd() {
return ad;
}
public String getSoyad() {
return soyad;
}
public String getBilgi() {
return this.ad + " " + this.soyad;
}
}
Kod 5-34. static kod blou rnei Yazar.java
package yazarlar;

public class YazarIslemleri {
private static Yazar[] yazarlar;

static {
yazarlar = new Yazar[5];
yazarlar[0] = new Yazar("Reat Nuri", "Gntekin");
yazarlar[1] = new Yazar("Necip Fazl", "Ksakrek");
yazarlar[2] = new Yazar("Yakup Kadri", "Karaosmanolu");
yazarlar[3] = new Yazar("Halit Ziya", "Uaklgil");
yazarlar[4] = new Yazar("Yahya Kemal", "Beyatl");
}

public static Yazar[] getYazarlar() {
return YazarIslemleri.yazarlar;
}
}
Kod 5-35. static kod blou rnei YazarIslemleri.java
package yazarlar;

public class Program {

public static void main(String[] args) {
Yazar[] yazarlar = YazarIslemleri.getYazarlar();
for (int i = 0; i < yazarlar.length; ++i) {
System.out.println(i + 1 + " - " + yazarlar[i].getBilgi());
}
}
}
Kod 5-36. static kod blou rnei Program.java
Programn kts:
1 - Reat Nuri Gntekin
2 - Necip Fazl Ksakrek
3 - Yakup Kadri Karaosmanolu
4 - Halit Ziya Uaklgil
5 - Yahya Kemal Beyatl
kt 5-5. static kod blou rnei program kts
5.4.4 final anahtar szc ve sabit tanmlama
final, nne yazld deikenin deerinin bir kez verildikten sonra
deitirilemeyeceini belirten bir anahtar szcktr. Dolaysyla sabit
tanmlamak iin kullanlr. final anahtar szc ile bir sabit tanm u
ekilde yaplabilir:
final double PI = 3.14;
Bir sabitin deeri verildikten sonra deitirilemeyeceine gre, sabit olarak
tanmlanm bir niteliin public olmasnda sarmalama ilkesi asndan
herhangi bir saknca yoktur. nk sarmalama ilkesinin temel amac,
nesnenin durumunda deiiklik yapabilecek kod kesiminin yalnzca snfn
iinde olmasn salayarak hem hatalara kar korumal, hem de kolay
deitirilebilir bir kod elde etmektir. Sabitler ise zaten
deitirilemeyeceklerinden public tanmlanmalarnda ilkeye aykr bir
durum yoktur. yleyse PI sabitini public tanmlayalm:
public final double PI = 3.14;
Bir sabitin kullanlabilmesi iin, sabitin iine tanmland snfa ait bir
nesne oluturulmas anlamszdr. nk sabitin nesnenin durumuna
ball sz konusu deildir. yleyse sabite snf zerinden eriilebilmesi
gerekir. Bu durumda sabitleri static tanmlamak anlaml olacaktr:
public final static double PI = 3.14;
Bir uygulamadaki sabitlerin bir arada tanmlanmas dnlebilir:
public class Sabitler {
public final static int SISTEMDEKI_OGRENCI_SAYISI = 100;
public final static int BIR_OGRENCININ_ALABILECEGI_DERS_SAYISI = 8;
public final static int BIR_OGRENCININ_ALABILECEGI_KREDI_SAYISI = 22;
}
Kod 5-37. Sabitlerin tanmland bir snf
Sabit adlar byk harflerle yazlr. Sabit ad birden fazla szckten
oluuyorsa, szckler altizgi ( _ ) ile birbirlerinden ayrlr. rnein en fazla
kayt saysn ifade edecek sabitin ad yle verilebilir:
EN_FAZLA_KAYIT_SAYISI
5.5 Kaltm (Inheritance)
Sarmalama konusunu anlatrken, nesneye ynelik programlama
yaklamnn 3 ilkesi/arac olduundan ve bunlardan ilkinin sarmalama
ilkesi olduundan sz etmitik.
Sarmalama ilkesi, niteliklere eriimi snfn iine kodlanan yntemlerle
snrlandrarak kodun deitirilebilirliini arttran ve bakmn kolaylatran
ilkedir.
Kaltm ise nesneye ynelik programlamann bu 3 ilke/aracndan ikincisidir.
Kaltmn getirisi, kodun yeniden kullanlabilirliini salamasdr. Buna ek
olarak 3. ara olan okbiimlilik (polymorphism) de kaltm sayesinde
gerekletirilebilmektedir.
Bu blmde nce nesneye ynelik bir modeldeki snflar arasnda nasl
ilikilerin bulunabileceinden bahsedilecek ve kaltmn
gerekletirilebilmesi iin modelde hangi ilikinin bulunmas gerektii
aklanmaya allacaktr. Daha sonra kaltmn ne olduu anlatlacak ve
Java dilinde nasl gerekletirildii rneklerle gsterilecektir.
5.5.1 Nesneye Ynelik Bir Modelde Snflar Aras likiler
Nesneye ynelik modeli oluturmak iin nce modeldeki snflarn
belirlenmesi gerekir. Snflarn belirlenmesi iin kullanlabilecek basit bir
yntem; gereksinimleri anlatan belgedeki varlk isimlerinin seilmesi,
sonra bu isimlerden hangilerinin snf, hangilerinin nitelik olabileceine,
snf olmas dnlenlerden hangilerinin baka snflarla nasl ilikileri
olduuna karar verilmesidir. Bu yaklam iyi bir balang yaplmasn
salayabilir. Daha sonra bu snflarn zerinden tekrar tekrar geilerek
gereksinimler irdelenir, gerekli yntemler ve nitelikler belirlenir, snflarn
bazlar elenip, baz yeni snflar eklenebilir.
Modelde hangi snflarn yer alacann belirlenmesi modelin oluturulmas
iin yeterli deildir. Bu snflar arasndaki ilikilerin de ekillendirilmesi
gerekmektedir. Peki iki snf arasnda bulunabilecek ilikiler nelerdir ve bu
ilikiler nasl ortaya kartlacaktr?
ki snf arasnda bulunabilecek 3 temel iliki vardr:
Bamllk (Dependency)/ Kullanr (uses a) ilikisi: Eer bir
snfn yntemlerinden en az bir tanesi baka bir snfa ait en az bir tane
parametre alyorsa, parametre alan yntemin iinde bulunduu snf dier
snfa bamldr (depends) ya da onu kullanr (uses) denir. Aadaki
rnekle bu ilikiyi aklamaya alalm:
public class A {
public void yontem(B b) {
//....
}
}
Kod 5-38. ki snf arasndaki bamllk ilikisi
Bu kod kesimine gre A snf B snfna bamldr ya da A snf B snfn
kullanr. Bamllk ilikisi, A snfn B snfnn kodunda yaplabilecek
deiikliklerde potansiyel olarak deiebilecek bir snf yapt iin
nemlidir. Eer A snf B snfn kullanyorsa, B snfnda yaplabilecek
herhangi bir deiikliin A snfn etkilemesi olasdr. Dolaysyla bu iki snf
birlikte ynetilmelidir.
Gelitirilen bir uygulamada snflar aras bamllklarn artmas demek,
birlikte ynetilmesi gereken snf saysnn da artmas demektir. Bu
durumda kodun ynetilebilirlii ve bakm kolayl azalacaktr. nk
yaplacak her deiiklik potansiyel olarak baka snflarn da deitirilmesi
sonucunu getireceinden bakm yk artmaktadr. Bunun nne
geilebilmesi iin uygulanan bir takm teknikler vardr. Tasarm rntleri
(Design Patterns) bal altnda anlatlan tekniklerden bazlar snflar aras
bamllklarn azaltlmasna yneliktir. Burada tasarm rntleri
anlatlmayacaktr ancak kabaca u sylenebilir: snflar aras bamllklarn
azaltlabilmesi iin yaplabilecek en basit ey, birbiri ile yakn iliki iinde
bulunan snflar bir alt sistem gibi dnp, bu alt sistemin baka alt
sistemlerle ilikisini kuracak tek bir snf kodlanmasdr. Bylece bir alt
sistemdeki snflarn farkl alt sistemlerdeki snflarla bamllklar
azaltlabilir.
Birletirme (composition) / erir (has a) ilikisi: Eer bir
snfn niteliklerinden en az bir tanesi baka bir snfn trndense, nitelie
sahip olan snf dier snf ierir denir. Aadaki rnek ierme ilikisini
rneklemektedir:
public class A {
private B b;
// ....
}
Kod 5-39. ki snf arasndaki ierme ilikisi
A snfnn B snfna ait bir nitelii bulunduuna gre A snf B snfn ierir
(A has a B).
Kaltm (inheritance) / is a ilikisi: Eer bir snfa ait btn
nesneler ayn zamanda daha genel bir baka snfa da aitse, o zaman bu
iki snf arasnda kaltm ilikisinden sz edilir. rnein her Kara Tat bir
Tat, her Motorlu Kara Tat ayn zamanda hem bir Kara Tat hem
de bir Tattr. Dolaysyla Kara Tat ile Tat arasnda bir kaltm
ilikisi, Motorlu Kara Tat ile Kara Tat arasnda da baka bir kaltm
ilikisi bulunmaktadr.
Bazen kaltm ilikisi ile ierme ilikisi birbirine kartrlr. Oysa bu iki iliki
nemli bir farkla birbirlerinden ayrlrlar. Modeli olutururken hangi ilikinin
doru olduunun bulunabilmesi iin, aralarndaki ilikinin bulunmaya
alld A ve B snflar iin u iki nermenin snanmas gerekir:
1. nerme: Her A bir Bdir (A is a B): Kaltm ilikisi
2. nerme: Her Ann bir Bsi vardr (A has a B): erme ilikisi
Eer Her A bir Bdir ifadesi doru bir nerme ise A snf ile B snf
arasnda kaltm ilikisi vardr ve A snf B snfndan kaltm yapmaktadr.
Eer Her Ann bir Bsi vardr ifadesi doru bir nerme ise A snf ile B
snf arasnda ierme ilikisi vardr ve A snfnn nitelikleri arasnda B
snfnn trnden bir (ya da daha fazla) nitelik vardr.
rnein, Nokta snf ile Cember snf arasndaki ilikinin nasl bir iliki
olduunu bulmaya alalm:
1. nerme: Her Cember bir Noktadr.
2. nerme: Her Cemberin bir merkez Noktas vardr.
Grld gibi 2. nerme doru bir nermedir. yleyse iliki ierme
ilikisidir ve Cember snfnn iinde Nokta snfna ait bir nitelik
tanmlanmas gerekmektedir.
erme ilikisi de kaltm ilikisi de kodun yeniden kullanlabilirliini
salamaktadr. Ancak unutulmamas gereken nokta udur: Nesneye
ynelik model oluturulurken, ama kodun yeniden kullanlrln
salamak deil doru bir model oluturmaktr. yleyse snflar arasndaki
ilikilerin doru tanmlanmas gerekir. nk doru oluturulmu bir
model, zaten yanl bir modele oranla daha kolay gerekletirilebilecek ve
bakm daha kolay yaplabilecek bir model olacaktr.
ki snf arasnda birden fazla iliki bulunuabilir. rnein Cember snf ile
Nokta snf arasnda ierme ilikisi olduu gibi, bamllk ilikisi de
olabilir: Cember snfnn yntemlerinden bir ya da daha fazlas Nokta
snfndan bir nesneyi parametre alabilir.
5.5.2 Javada Kaltm
Kaltm, programlama ortamnda da gerek hayattaki tanmna benzer bir
ii gerekletirir. Bir snfn baka bir snftan kaltm yapmas demek,
kaltm yapan snfn dier snftaki nitelik ve yntemleri kendisine almas
demektir. Eer kaltm yapan snfa alt snf, kendisinden kaltm yaplan
snfa ata snf dersek, ata snfta tanml olan hereyin (kurucular hari)
alt snf iin de tanml olduunu syleyebiliriz.
Javada kaltm, extends anahtar szc ile gerekletirilir. Eer bir A
snfn B snfndan kaltm yapmas isteniyorsa, A snf
public class A extends B {
}
eklinde tanmlanr.
Bu tanmlama, B snfnn iine kodlanm btn niteilk ve yntemlerin
(kurucular hari hereyin) A snf iin de tanml olmasn salar. Bylece B
snfna yazlan kodlar A snf iine yazlmadan A snf iin de kullanlabilir.
A snfna B snfnn alt snf (subclass) ya da ocuu (child), B snfna da
A snfnn ata snf ya da atas (ancestor) denir.
Kaltm ilikisi, UML (Unified Modeling Language) dilinde sembol ile
ifade edilir ve birden fazla dzeyli de kurulabilir. Aada, Tasit snf ve o
snfn alt snflarndan bazlarn gsteren bir kaltm aac grlmektedir.

ekil 5-8. Tasit snfnn kaltm aac
Kaltm aacnda yukarya doru kldka genele, aaya doru inildike
zele gidilir. Tasit, en genel ifade ile btn tatlar belirtir. Bisiklet ise,
ok daha zel bir tattr. Ata snflar, alt snflarn daha genel bir kmesidir.
Kaltm belirten sembol kendisinden kaltlan snf ynnde izlenirse,
genele doru gidilmi olur. Bu nedenle bu ilikiye UML balamnda
genelletirme (generalization) ilikisi de denir.
Tasit snfnn ve alt snflarnn rnek olarak gsterildii yukardaki aac
oluturmak zere yazlacak snf tanmlar aadaki tanmlara
benzeyecektir:
public class Tasit {
}
public class KaraTasiti extends Tasit {
}
public class HavaTasiti extends Tasit {
}
public class DenizTasiti extends Tasit {
}
public class MotorluKaraTasiti extends KaraTasiti {
}
public class MotorsuzKaraTasiti extends KaraTasiti {
}
public class Otomobil extends MotorluKaraTasiti {
}
public class Mobilet extends MotorluKaraTasiti {
}
public class Fayton extends MotorsuzKaraTasiti {
}
public class Bisiklet extends MotorsuzKaraTasiti {
}
Kod 5-40. Tasit snfnn kaltm aacn oluturacak snf tanmlar
Kaltm aacnn derinliini snrlayan herhangi bir kural yoktur. Derinlik ne
olursa olsun, aacn alt yapraklarndaki snflar, kendi st yapraklarndaki
snflarn alt snflardr. rnein Mobilet snf hem MotorluKaraTasiti
snfnn alt snf, hem KaraTasiti snfnn alt snf, hem de Tasit
snfnn alt snfdr. Bununla birlikte, Mobilet snf MotorluKaraTasiti
snfnn dorudan alt snf (direct subclass), KaraTasiti ve Tasit
snflarnn ise dolayl alt snfdr (indirect subclass). Alt snflar kendi
stlerindeki btn snflarn nitelik ve yntemlerini kaltm ile alr. rnek
kaltm aacmza gre, KaraTasiti snf kendi atas olan Tasit snfndan,
MotorluKaraTasiti snf KaraTasiti snfndan, Mobilet snf da
MotorluKaraTasiti snfndan btn nitelik ve yntemleri alacaktr.
Bylece en stteki Tasit snfnda tanmladmz bir yntem, en alttaki
Mobilet snf iin de tanml olacaktr.
imdi bu anlattklarmz kod ile grmeye alalm:
package kalitim;
public class Tasit {
public void ilerle(int birim) {
System.out.println("Tat " + birim + " birim ilerliyor..");
}
}
Kod 5-41. Kaltm rnei Tasit snf
package kalitim;
public class KaraTasiti extends Tasit {
private int tekerlekSayisi;

public int getTekerlekSayisi() {
return this.tekerlekSayisi;
}
}

Kod 5-42. Kaltm rnei KaraTasiti snf
package kalitim;
public class HavaTasiti extends Tasit {
// snf tanm bu rnek iin bo braklmtr
}
Kod 5-43. Kaltm rnei HavaTasiti snf
package kalitim;
public class DenizTasiti extends Tasit {
// snf tanm bu rnek iin bo braklmtr
}
Kod 5-44. Kaltm rnei DenizTasiti snf
package kalitim;
public class MotorluKaraTasiti extends KaraTasiti {
private int motorHacmi;

public int getMotorHacmi() {
return motorHacmi;
}
}
Kod 5-45. Kaltm rnei MotorluKaraTasiti snf
package kalitim;
public class MotorsuzKaraTasiti extends KaraTasiti {
// snf tanm bu rnek iin bo braklmtr
}
Kod 5-46. Kaltm rnei MotorsuzKaraTasiti snf
package kalitim;
public class Mobilet extends MotorluKaraTasiti {
// snf tanm bu rnek iin bo braklmtr
}
Kod 5-47. Kaltm rnei Mobilet snf
package kalitim;
public class Otomobil extends MotorluKaraTasiti {
// snf tanm bu rnek iin bo braklmtr
}
Kod 5-48. Kaltm rnei Otomobil snf
package kalitim;
public class Fayton extends MotorsuzKaraTasiti {
// snf tanm bu rnek iin bo braklmtr
}
Kod 5-49. Kaltm rnei Fayton snf
package kalitim;
public class Bisiklet extends MotorsuzKaraTasiti {
// snf tanm bu rnek iin bo braklmtr
}
Kod 5-50. Kaltm rnei Bisiklet snf
Yukardaki snflarn kodlar incelenirse, Tasit snfnda ilerle() yntemi,
KaraTasiti snfnda tekerlekSayisi nitelii ile getTekerlekSayisi()
yntemi, MotorluKaraTasiti snfnda ise motorHacmi nitelii ile
getMotorHacmi() yntemlerinin kodland, dier snflarn iinin imdilik
bo brakldklar grlr.
Kaltm anlatrken herhangi bir alt snf, ata snflarndaki hereyi alr
demitik. Bu durumda rnein Bisiklet snfnn, KaraTasiti snfnda
tanmlanm olan tekerlekSayisi nitelii ile getTekerlekSayisi()
yntemini, Tasit snfnda tanmlanm olan ilerle() yntemini alm
olmasn bekliyoruz. Bunu snamak zere rnek kod yazalm:
package kalitim;
public class Program {
public static void main(String[] args) {
Bisiklet bisiklet = new Bisiklet();
bisiklet.ilerle(5);
System.out.print("Bisikletin " + bisiklet.getTekerlekSayisi() +
" tekerlei var.");
}
}
Kod 5-51. Kaltm rnei rnek program
Bu program altrldnda, nce bir Bisiklet nesnesi oluturulur. Sonra
bu nesneye ilerle(5) iletisi gnderilir. Bisiklet snfnn iinde (bkz. Kod
5-48) ilerle() yntemi tanmlanmam olmamasna ramen ekranda
Tat 5 birim ilerliyor.. kts oluur. nk Bisiklet snf dolayl
olarak Tasit snfnn alt snfdr ve Tasit snfnda tanmlanm olan
ilerle() yntemi kaltm ile Bisiklet snfna aktarlmtr. Baka bir
deyile, Bisiklet snfnn iinde ilerle() yntemi kodlanmam olsa bile,
ata snfndan ald ilerle() yntemi zaten vardr ve bu yntem iletilir.
Benzer ekilde, bisiklet.getTekerlekSayisi() ars, Bisiklet
snfnn dolayl olarak atas olan KaraTasiti snfndan ald
getTekerlekSayisi() ynteminin iletilmesine neden olur. Bu yntem
iletildii zaman, Bisiklet snfnn KaraTasiti snfndan kaltmla alm
olduu tekerlekSayisi niteliinin deerini dndrecektir. Kodun hibir
kesiminde tekerlekSayisi niteliine deer atanmad ve int trnn
varsaylan deeri 0 (sfr) olduu iin, ekranda Bisikletin 0 tekerlei
var. yazlacaktr. Bylece programn kts yle olur:
Tat 5 birim ilerliyor..
Bisikletin 0 tekerlei var.
kt 5-6. Kaltm rnei rnek programn kts
Bunu ekil 5-9 ile aklamaya alalm: Grld gibi bellekteki bisiklet
adl referans deiken Bisiklet snfna ait olan ve ynda oluturulan
nesneyi gstermektedir. Bisiklet snfnn atalarndan ald niteilk ve
yntemler, nesnenin iinde farkl renkteki daireler iinde gsterilmitir.
Bisiklet tipindeki nesne, Tasit snfndan gelen ileti() yntemi ile
KaraTasiti snfndan gelen tekerlekSayisi nitelii ve
getTekerlekSayisi() yntemine sahiptir.

ekil 5-9. Bisiklet snfnn ii
Kaltmda, alt snfn nesnesi oluturulduunda bu nesnenin iinde ata
snfa bir i-nesne de oluturulur. -nesne de kendi ata snfna ait bir i-
nesneyi ierecek ve bu en stteki snfa kadar zincirleme bir ekilde
gidecektir. ekilde 5-9daki farkl renkli daireler aslnda bu durumu
gstermektedir.
Bir nesnenin iinde baka bir nesnenin var olmas, daha nce anlattmz
ierme (composition) ilikisi ile de olanakldr. Ancak kaltmda farkl olan
nokta, ierilen ata snfa ait nesnenin kendi arayzn (public ya da
protected tanmlanm yntem ve niteliklerini) alt snfa aktarmasdr.
Bylece alt snf, kendi atalarnn da arayzlerine sahip olur.
Sarmalama kodun deitirilebilirliini ve bakm kolayln, kaltm ise kodun
yeniden kullanlabilirliini arttrr.
5.5.3 Kaltmla Gelen Nitelik ve Yntemlere Eriim
Kaltm konusunda genelde en ok kafa kartran konu, ata snftan gelen
nitelik ya da yntemlere dorudan eriimin bazen olanakl olmamasdr. Bir
snf, kurucular hari atasndaki hereyi kaltmla alr dedik. Bu ifadeye
gre, Bisiklet snf KaraTasiti snfndan tekerlekSayisi niteliini
almaktadr. Bununla birlikte, Bisiklet snf iinde tekerlekSayisi
niteliine dorudan eriilemez. nk bu nitelik, KaraTasiti snfnda
private tanmlanmtr. private eriim dzenleyicisi, tanmland snfn
dndan eriimi engelleyen bir anahtar szcktr. Dolaysyla, KaraTasiti
snf iinde tanmlanm olan tekerlekSayisi nitelii, alt snf olduklar
halde MotorluKaraTasiti ya da Bisiklet snflarndan dorudan
eriilemez.
Bir nitelie dorudan eriilemiyor olmas, o niteliin var olmad anlamna
gelmez. Bisiklet snfnn dolayl olarak atas olan KaraTasiti snfndan
ald tekerlekSayisi nitelii vardr, ancak Bisiklet snf bu nitelie
dorudan eriemez. Dorudan erimek ifadesiyle, Bisiklet snfna ait
kodun ierisinde tekerlekSayisi niteliinin kodlanamayacan
belirtiyoruz. Aksi taktirde derleme hatas alnacaktr.
Aslnda i-nesneler dnldnde durum herhangi bir belirsizlie ya da
zorlua yer brakmayacak kadar aklk kazanr. Bu i-nesneler farkl
snflara ait olduklarna gre ve farkl snflar arasndaki eriim kurallar da
eriim dzenleyicilere gre belirlendiine gre, hangi nitelik ya da
ynteme nereden eriilebilecei rahata grlebilir.
Aadaki kod kesimiyle bunu rnekleyelim:
package kalitim;
public class Bisiklet extends MotorsuzKaraTasiti {
public void tekerlekSayisiNiteligineErisim() {
tekerlekSayisi = 2; // ! Derleme hatas
}
}
Kod 5-52. Ata snfn private niteliine eriim
Kodu derleyelim:

ekil 5-10. Ata snfn private niteliine eriim derleme sonucu
Grld gibi tekerlekSayisi niteliine Bisiklet snf iinden erimeye
altmzda, derleyici bu niteliin ata snfta private tanmlandn
belirten bir hata iletisi dndryor.
Bu durum ekil 5-9da da grlebilmektedir. Bisiklet snfnn iinde i-
nesneleri belirtmek zere farkl renklerde daireler kullanlmtr. private
nitelik ya da yntemlere yalnzca kendi rengindeki dairelerin iinden
eriilebildii aktr. Bisiklet snfnn iinde atasndan gelen
tekerlekSayisi nitelii farkl renkteki bir dairenin iindedir. Demek ki bu
nitelie Bisiklet snfnn iinden dorudan eriilemez.
Snflar arasnda kaltm ilikisi olsa da eriim dzenleyiciler iin tanmlanm
kurallar geerlidir: private nitelik ya da yntemlere tanmlandklar snf
dndan eriilemez!
Dolaysyla, alt snf iinde ata snftan gelen private niteliklere erimek
iin, o niteliin deerine eriimi denetimli olarak gerekletirmek zere
sarmalama ilkesi erevesinde kodlanm yntemleri kullanmamz gerekir.
ki snf arasnda kaltm iliikisi kurulmu olsa da sarmalama ilkesi iin
sylediimiz herey halen geerlidir.
5.5.4 protected Eriim Dzenleyici
Eriim dzenleyicileri anlatrken, protected anahtar szcnn paket
eriimi iin kullanldn sylemitik. Ayrca kaltmda da farkl bir anlam
olduunu ve bunu kaltm konusu ile birlikte aklayacamz belirtmitik.
protected anahtar szc paket eriimini belirtmenin yansra,
aralarnda kaltm ilikisi bulunan snflar iin farkl bir grev daha stlenir:
protected tanmlanan nitelik ya da yntemlere dorudan ya da dolayl alt
snflardan eriilebilir. Baka bir ifade ile protected alt snflar iin public,
dier snflar iin private gibi yorumlanabilir.
rneimizdeki KaraTasiti snfnn tekerlekSayisi niteilini protected
yapalm. ncelikle, rneimizdeki dier btn snflarn KaraTasiti snf
ile ayn pakette olduklar iin tekerlekSayisi niteliine dorudan
eriebileceklerini syleyebiliriz:
package kalitim;
public class KaraTasiti extends Tasit {
protected int tekerlekSayisi;
public int getTekerlekSayisi() {
return this.tekerlekSayisi;
}
}
Kod 5-53. KaraTasiti snfnda protected nitelik tanmlama
package kalitim;
public class DenizTasiti extends Tasit {
public void protectedErisimOrnegi() {
KaraTasiti k = new KaraTasiti();
k.tekerlekSayisi = 5; // protected nitelie eriim!!
}
}
Kod 5-54. KaraTasiti snf ile ayn paketteki bir snftan protected nitelie eriim
DenizTasiti snf ile KaraTasiti snf arasnda kaltm ilikisi
olmamasna ramen (her ikisi de Tasit snfnn alt snfdr ama kendi
aralarnda bir iliki tanmlanmamtr), bu iki snf da ayn pakette olduu
iin DenizTasiti snfndaki bir yntemden KaraTasiti snfna ait
nesnenin tekerlekSayisi niteliine dorudan eriilebilmektedir.
DenizTasiti snfn baka bir pakete tayalm:
package kalitim1;
import kalitim.KaraTasiti;
import kalitim.Tasit;
public class DenizTasiti extends Tasit {
public void protectedErisimOrnegi() {
KaraTasiti k = new KaraTasiti();
k.tekerlekSayisi = 5;
}
}
Kod 5-55. DenizTasiti snfnn kalitim1 adl bir pakete tanmas
Kodlar yeniden derleyelim:

ekil 5-11. Kodlarn yeniden derlenmesi
Grld gibi DenizTasiti snf artk kalitim1 adl farkl bir pakette
olduu iin KaraTasiti snfna ait protected tanml tekerlekSayisi
niteliine eriemez. Derleyici bu durumu belirten bir hata iletisi
dndrmektedir.
imdi farkl pakette olsa da alt snftan protected tanmlanm nitelie
eriilebileceini gsterebilmek iin Bisiklet snfn kalitim1 paketine
tayalm (bu arada DenizTasiti snfn da tekrar kalitim paketine
tayarak derleme hatasndan kurtulalm):
package kalitim1;
import kalitim.MotorsuzKaraTasiti;
public class Bisiklet extends MotorsuzKaraTasiti {
public void tekerlekSayisiNiteligineErisim() {
tekerlekSayisi = 2;
}
}
Kod 5-56. Bisiklet snfnn kalitim1 paketine tanmas
Kodu derleyelim:

ekil 5-12. Kodlarn yeniden derlenmesi
Bisiklet snf farkl bir pakette olduu halde, dolayl olarak atas olan
KaraTasiti snfndan gelen tekerlekSayisi adli nitelie dorudan
eriebildi ve derlemede herhangi bir hata olumad. nk
tekerlekSayisi nitelii KaraTasiti snfnda protected tanmlanm
durumda ve protected tanml nitelik ya da yntemlere, dorudan ya da
dolayl alt snflardan eriilebilmektedir.
protected eriim dzenleyicisi kaltm ilikisi sz konusu olduunda
private ve public eriimin arasnda bir eriim salamaktadr. Ancak bu
zelliin kullanlabilecei durumlar pek sk olumamaktadr. protected
eriimin ayn zamanda paket eriimine de izin verdii unutulmamal,
dolaysyla bu anahtar szck sarmalama ilkesine zarar vermeyecek ekilde
dikkatle kullanlmaldr.
5.5.5 Kurucu Zinciri ve super Anahtar Szc
Bir snfa ait nesne oluturulurken, o snfn bir kurucusunun iletildiini,
kurucunun almas tamamlandktan sonra bellekte artk bir nesnenin
olutuunu biliyoruz. Kurucular da nesneleri ilk oluturulduklar anda
anlaml durumlara tayabilmek iin kullanyoruz. Bu durumda, eer
nesnesi oluturulacak snf baka bir snfn alt snfysa, nce ataya ait i-
nesnesinin oluturulmas ve bu nesnenin niteliklerinin ilk deerlerinin
verilmesi gerektiini syleyebiliriz. ekil 5-9da grlen iie nesnelerin
oluabilmesi iin nesnelerin iten da doru olumas gerekir.
-nesnenin oluabilmesi iin, nesnesi oluturulacak snfa ait kurucu
iletilmeye balad zaman ilk i olarak ata snfa ait kurucu arlr. Eer
ata snf da baka bir snfn alt snfysa, bu kez o snfn kurucusu arlr.
Kurucu zinciri alt snftan ata snfa doru bu ekilde ilerler. En stte,
kaltm aacnn tepesindeki snfn kurucusunun almas sonlandktan
sonra sras ile alt snflarn kurucularnn almas sonlanacaktr. Bylece
iie nesneler sra ile oluturularak en son en dtaki nesne oluturulmu
olur ve kurucu zinciri tamamlanr.
imdi, Tasit rneimize geri dnelim ve Bisiklet snfndan balayarak
btn atalarna parametre almayan birer kurucu yazalm:
package kalitim;
public class Bisiklet extends MotorsuzKaraTasiti {
public Bisiklet() {
System.out.println("Bisiklet snfnn kurucusu");
}
}
Kod 5-57. Kurucu zinciri Bisiklet snf
package kalitim;
public class MotorsuzKaraTasiti extends KaraTasiti {
public MotorsuzKaraTasiti() {
System.out.println("MotorsuzKaraTasiti snfnn kurucusu");
}
}
Kod 5-58. Kurucu zinciri MotorsuzKaraTasiti snf
package kalitim;
public class KaraTasiti extends Tasit {
protected int tekerlekSayisi;

public KaraTasiti() {
System.out.println("KaraTasiti snfnn kurucusu");
}

public int getTekerlekSayisi() {
return this.tekerlekSayisi;
}
}
Kod 5-59. Kurucu zinciri KaraTasiti snf
package kalitim;
public class Tasit {
public Tasit() {
System.out.println("Tasit snfnn kurucusu");
}
public void ilerle(int birim) {
System.out.println("Tat " + birim + " birim ilerliyor..");
}
}
Kod 5-60. Kurucu zinciri Tasit snf
imdi de kk bir programla sadece bir Bisiklet nesnesi oluturalm:
package kalitim;
public class Program {
public static void main(String[] args) {
Bisiklet bisiklet = new Bisiklet();
}
}
Kod 5-61. Kurucu zinciri Program snf
Bu program altrld zaman nce Bisiklet snfnn kurucusu
arlacaktr. Yukarda anlattklarmza gre, Bisiklet snfnn kurucusu
ata snf olan MotorsuzKaraTasiti snfnn kurucusunu arr.
MotorsuzKaraTasiti snfnn kurucusu, kendi atas olan KaraTasiti
snfnn kurucusunu, KaraTasiti snfnn kurucusu ise Tasit snfnn
kurucusunu aracaktr. Tasit snf baka bir snfn alt snf olarak
tanmlanmadna gre Object snfnn alt snfdr Eer bir snf iin
extends ile kaltm ilikisi tanmlanmazsa o snf Object snfnn alt snf
olur. Dolaysyla btn snflar Object snfnn dorudan ya da dolayl alt
snfdr.) ve Object snfnn kurucusunu arr. Object snfnn kurucusu
iletildikten sonra Tasit snfnn kurucusu iletilecek ve ekranda Tasit
snfnn kurucusu yazacaktr. Kurucu sonlannca bunu aran kesime
dnlecek ve ekrana KaraTasiti snfnn kurucusu yazlacak, buradan
dnlnce MotorsuzKaraTasiti snfnn kurucusu yazlacak ve son olarak
da Bisiklet snfnn kurucusu yazlacaktr.
ktya bakalm:
Tasit snfnn kurucusu
KaraTasiti snfnn kurucusu
MotorsuzKaraTasiti snfnn kurucusu
Bisiklet snfnn kurucusu
kt 5-7. Kurucu zinciri Program kts
Bir snfa ait kurucu iletilirken, eer kurucunun iine ata snfn hangi
kurucusunun arlacan belirten kod yazlmamsa, ata snfn varsaylan
kurucusu arlr (varsaylan kurucunun parametre almayan kurucu
olduunu ve eer bir snfn iine hi kurucu yazlmazsa derleyici
tarafndan bir varsaylan kurucu oluturulduunu hatrlayn). Bu durum,
kodun iinde gizlice (implicitly) var olan super() ars ile gerekletirilir.
Yani eer programc kurucunun iine ata snfn hangi kurucusunun
arlacan kodlamazsa, derleyici tarafndan ata snfn varsaylan
kurucusunu aracak super(); deyimi eklenir. Programc tarafndan
kurucunun ilk deyimi olarak aktan (explicitly) super() yazlmas da
varsaylan kurucunun arlmasn salayacaktr.
rneimize geri dnerek Bisiklet snfnn kurucusunda ata snfn
varsaylan kurucusunu aktan aralm:
package kalitim;
public class Bisiklet extends MotorsuzKaraTasiti {
public Bisiklet() {
super(); // ata snfn varsaylan kurucusu arlyor
System.out.println("Bisiklet snfnn kurucusu");
}
}
Kod 5-62. super anahtar szcnn aktan kullanl
Eer ata snfta varsaylan kurucu yoksa ve programc alt snftaki
kurucunun iinde ata snfn hangi kurucusunun arlacan belirtmezse
derleme hatas alnacaktr. nk derleyici aksi belirtilmedike ata snfn
varsaylan kurucusunu aran super() kodunu retecektir.
Ata snfn hangi kurucusunun arlaca, super anahtar szc ile
birlikte verilen parametrelere gre belirlenir. Nasl ki new ileci ile birlikte
kullandmz parametreler hangi kurucunun arlacan belirliyorsa,
super anahtar szc ile birlikte kullanlan parametreler de ayn ekilde
ata snfn hangi kurucusunun iletileceini belirler.
rnein, KaraTasiti snfmzda tekerlek saysn parametre olarak alan
bir kurucu yazalm ve dier kurucuyu silelim:
package kalitim;
public class KaraTasiti extends Tasit {
protected int tekerlekSayisi;

public KaraTasiti(int tekerlekSayisi) {
this.tekerlekSayisi = tekerlekSayisi;
System.out.println("KaraTasiti snfnn kurucusu");
}

public int getTekerlekSayisi() {
return this.tekerlekSayisi;
}
}
Kod 5-63. super anahtar szc - KaraTasiti snf
Artk KaraTasiti snfna bir kurucu yazdmza gre derleyici tarafndan
varsaylan kurucu retilmeyecektir.
imdi dier snflarn kodlarn deitirmeden yeniden derleyelim:

ekil 5-13. Kodlarn yeniden derlenmesi
KaraTasiti snfnda artk parametresiz bir kurucu olmad ve
MotorsuzKaraTasiti snfnn kurucusunda ata snfn parametreli
kurucusunu aracak herhangi bir kod yazlmadndan derleme hatas
aldk.
imdi MotorsuzKaraTasiti ve Bisiklet snflarna, tekerlek saysn
parametre alan kurucular ekleyelim:
package kalitim;
public class MotorsuzKaraTasiti extends KaraTasiti {
public MotorsuzKaraTasiti(int tekerlekSayisi) {
super(tekerlekSayisi);
System.out.println("MotorsuzKaraTasiti snfnn kurucusu");
}

}
Kod 5-64. super anahtar szc MotorsuzKaraTasiti snf
package kalitim;
public class Bisiklet extends MotorsuzKaraTasiti {
public Bisiklet(int tekerlekSayisi) {
super(tekerlekSayisi);
System.out.println("Bisiklet snfnn kurucusu");
}
}
Kod 5-65. super anahtar szc - Bisiklet snf
Programmz da bisiklet nesnesini olutururken tekerlek saysn
belirleyecek ekilde deitirelim:
package kalitim;
public class Program {
public static void main(String[] args) {
Bisiklet bisiklet = new Bisiklet(2);
System.out.println("Bisikletin " +
bisiklet.getTekerlekSayisi() + " tekerlei vardr..");
}
}
Kod 5-66. super anahtar szc Program snf
Program ilettiimizde oluan kt:
Tasit snfnn kurucusu
KaraTasiti snfnn tekerlek saysn parametre alan kurucusu
MotorsuzKaraTasiti snfnn kurucusu
Bisiklet snfnn kurucusu
Bisikletin 2 tekerlei vardr..
kt 5-8. super anahtar szc Program kts
Program altrld zaman kurucu zinciri gene ayn srada iletildi. Ancak
bu sefer super anahtar szcn aktan kullanarak hangi kurucunun
altrlacan belirlemek zorunda kaldk. Programmza eklediimiz yeni
satrla da bisiklet nesnemizin atalarndan birisi olan KaraTasiti snfnn
kurucusunda deeri belirlenen tekerlekSayisi niteliinin deerini ekrana
yazdrdk. Bu deer Bisiklet snfnn kurucusuna parametre olarak
verilmiti. Ancak super(tekerlekSayisi) deyimi ile bu deeri nce
MotorsuzKaraTasiti snfnn kurucusuna, oradan da KaraTasiti snfnn
kurucusuna gndermi olduk.
5.5.6 Yntemlerin Geersiz Klnmas (Method Overriding)
Ayn isimde farkl parametre listesi (say, tr ya da sralar farkl olan
parametreler) ile birden fazla yntem kodlanmasn Yntemlerin Ar
Yklenmesi (Method Overloading) olarak adlandrmtk.
Ar ykleme, bir snfn iine ata snflarndaki protected ya da public
tanmlanm yntemlerle ayn isimde ve farkl parametre listesine sahip
yeni yntemler yazlarak da gerekletirilebilir. nk bu snf ata
snfndaki yntemleri kaltmla alacaktr.
Yntem Geersiz Klma ise bir alt snfn iine dorudan ya da dolayl ata
snflarndan gelen bir (ya da daha fazla) yntemin aynsnn (ayn yntem
ad ve ayn parametre listesi) kodlanmasna verilen addr.
Yntem geersiz klma ile ilgili genelde una benzer sorular sorulur: ata
snftan zaten alnan yntemin aynsn alt snfta neden tekrar kodlarm?,
kaltm kodun yeniden kullanlabilirliini arttrrken, benim alt snfa ayn
yntem(ler)i yeniden kodlamam elikili deil mi?.
Yntem geersiz klma ile ilgili olarak bir noktann gzden karlmamas
gerekir: alt snfa kodlanan yntem, ata snftaki yntemle ayn ad
ve parametre listesine sahiptir, ancak ata snftaki yntemle ayn
kodlar iermemelidir! Zaten alt snfa ata snftaki yntemin tamamen
aynsn kodlamak elbette elikili, hatta sama ve anlamsz olacaktr.
Geersiz klmann neden gerekli olduunu anlayabilmek iin ncelikle
kaltm aacnda aaya doru inildike daha zel snflara, yukarya
doru kldka daha genel snflara ulaldn hatrlamamz gerekir. Ata
snfta tanmlanan bir yntem, o snfn genelletirdii btn alt snflarn
ortak zelliklerine gre alan bir yntem olacaktr. Alt snflara inildike
snflar zelletii iin, ata snftaki yntem alt snf iin fazla genel ve
dolaysyla yetersiz kalabilir. Bu durumda alt snf, kendi zelliklerine bal
olarak daha zel bir gerekletirim yapacaktr.
Bazen bu gerekletirim ata snftakini kullanp zerine bireyler ekleyecek,
bazen de tamamen farkl olacak ekilde kodlanabilir. Eer alt snftaki
gerekletirim ata snftaki yntemi kullanacak ve zerine bireyler
ekleyecekse, super anahtar szc atadaki yntemi armak zere
kullanlabilir. this anahtar szcnn iinde bulunulan nesneye referans
olmas gibi, super anahtar szc de ata snfa ait i nesneye referanstr.
imdi Tasit rneimize geri dnelim ve snflarmzn iine ekrana o
snftan oluturulan nesnelerle ilgili bilgi dndrmek zere bilgiVer()
yntemlerini kodlayalm:
package kalitim;
public class Tasit {
public Tasit() {
}
public void ilerle(int birim) {
System.out.println("Tat " + birim + " birim ilerliyor..");
}
public String bilgiVer() {
return "Tasit";
}
}
Kod 5-67. Yntem Geersiz Klma Tasit snf
package kalitim;
public class KaraTasiti extends Tasit {
private int tekerlekSayisi;

public KaraTasiti(int tekerlekSayisi) {
this.tekerlekSayisi = tekerlekSayisi;
}
public int getTekerlekSayisi() {
return this.tekerlekSayisi;
}
public String bilgiVer() {
return super.bilgiVer() + " - KaraTasiti";
}
}
Kod 5-68. Yntem Geersiz Klma KaraTasiti snf
package kalitim;
public class MotorsuzKaraTasiti extends KaraTasiti {
public MotorsuzKaraTasiti(int tekerlekSayisi) {
super(tekerlekSayisi);
}
public String bilgiVer() {
return super.bilgiVer() + " - MotorsuzKaraTasiti";
}
}
Kod 5-69. Yntem Geersiz Klma MotorsuzKaraTasiti snf
package kalitim;
public class Bisiklet extends MotorsuzKaraTasiti {
public Bisiklet(int tekerlekSayisi) {
super(tekerlekSayisi);
}
public String bilgiVer() {
return super.bilgiVer() + " - Bisiklet";
}
}
Kod 5-70. Yntem Geersiz Klma Bisiklet snf
imdi Bisiklet snf ile Tasit snfndan birer nesne oluturup, bu
nesnelere ait bilgileri ekrana yazmak zere bilgiVer() yntemlerini
aran program kodlayalm.
package kalitim;
public class Program {
public static void main(String[] args) {
Bisiklet bisiklet = new Bisiklet(2);
System.out.println("Bisiklet'in bilgileri: " +
bisiklet.bilgiVer());

Tasit tasit = new Tasit();
System.out.println("Tasit'in bilgileri: " + tasit.bilgiVer());
}
}
Kod 5-71. Yntem Geersiz Klma Program snf
Bu program iletildii zaman, Bisiklet snfndan oluturulan nesne
zerinden arlan bilgiVer() yntemi, nce dorudan atas olan
MotorsuzKaraTasiti snfnn bilgiVer() yntemini arr.
MotorsuzKaraTasiti snfndaki bilgiVer() yntemi benzer ekilde
KaraTasiti snfndaki bilgiVer() yntemini, o da Tasit snfndaki
bilgiVer() yntemini arr. Tasit snfnn bilgiVer() ynteminden
geriye Tasit dner, KaraTasiti snf buna KaraTasiti ekleyip
dndrr, MotorsuzKaraTasiti snf buna MotorsuzKaraTasiti ekleyip
dndrr ve en son Bisiklet snfnda buna Bisiklet eklenip
dndrlr. Dnen sonu Program snfnda ekrana yazdrlr: Bisiklet'in
bilgileri: Tasit - KaraTasiti - MotorsuzKaraTasiti Bisiklet. Tasit
snfndan oluturulan nesneye gnderilen bilgiVer()
iletisinden ise Tasit dner ve Program snfnda ekrana
Tasit'in bilgileri: Tasit yazdrlr. Programn kts:
Bisiklet'in bilgileri: Tasit - KaraTasiti - MotorsuzKaraTasiti - Bisiklet
Tasit'in bilgileri: Tasit
kt 5-9. Yntem Geersiz Klma Program kts
Grld gibi Tasit snfndan alt snflarna doru inildike bilgiVer()
yntemi snfa bal olarak zellemektedir ve geersiz klma ile bu
zelleme ele alnmtr. rnekte ayrca super anahtar szcnn
atadaki ynteme ulamak zere nasl kullanld da grlmektedir.
5.5.7 Yntemlerde Geersiz Klmann final ile Engellenmesi
final anahtar szcnn sabit tanmlamada nasl kullanldn daha
nce grmtk. Eer final szc bir nitelikten nce kullanlrsa, o
nitelie bir kez deer atandktan sonra niteliin deeri deitirilemez.
final szcnn bir baka kullanm alan, geersiz klnmas istenmeyen
yntemlerin belirlenmesidir. Bir snfta tanmlanan yntemin alt snflarda
geersiz klnmas istenmiyorsa, o yntem final tanmlanr. final
tanmlanan yntemlerin alt snflarda geersiz klnamayaca derleyici
tarafndan garanti edilir.
5.5.8 Object snf
Javada btn snflar Object snfnn alt snfdr.
Yazdmz herhangi bir snfn tanmna extends Object yazmasak bile, bu
snf iin extends Object tanmldr. Dolaysyla btn snflar dorudan ya
da dolayl olarak Object snfnn alt snfdr. Bylece btn nesnelerin bu
snftaki yntemleri iermesi salanm olur.
imdi bu snftaki baz yntemleri inceleyelim:
protected Object clone(): Nesnenin bir kopyasn oluturur ve
dndrr.
public boolean equals(Object obj): Parametre olarak verilen
nesnenin bu yntem zerinden arld nesneye eit olup olmadn
bulur ve dndrr. Bildiimiz gibi eitlik denetimi yapan ile == ilecidir.
Ancak bu ile nesne referanslar iin kullanlrsa nesnelerin eitliini deil,
nesneleri gsteren referanslarn eitliini, yani referanslarn ayn adresi
gsterip gstermediklerini denetler. ki nesnenin birbirine eit olmas, bu
nesnelerin referanslarnn ayn adresi gstermesi demek deildir. ki
nesnenin eitlii, nesnelerin ait olduklar snflara gre denetlenmelidir.
rnein iki Zaman nesnesinin eit olmas demek, saat, dakika ve saniye
niteliklerinin deerlerinin eit olmas demektir. Dolaysyla iki Zaman
nesnesinin eit olup olmadklarn anlamak zere Zaman snfnn iinde
equals ynteminin kodlanmas (geersiz klnmas) gerekir.
public String toString(): Nesnenin String gsterimini oluturur ve
dndrr. Object snfndaki gerekletirimi nesnenin ait olduu snf ve
bellekteki adresini dndrr. String gsterimi istenen snflar iin
toString ynteminin geersiz klnmas gerekir. Tasit rneimizdeki
bilgiVer yntemlerinin adlarn toString yapalm:
package kalitim;
public class Tasit {
public Tasit() {
}
public void ilerle(int birim) {
System.out.println("Tat " + birim + " birim ilerliyor..");
}
public String toString() {
return "Tasit";
}
}
Kod 5-72. toString() yteminin geersiz klnmas Tasit snf
package kalitim;
public class KaraTasiti extends Tasit {
private int tekerlekSayisi;

public KaraTasiti(int tekerlekSayisi) {
this.tekerlekSayisi = tekerlekSayisi;
}
public int getTekerlekSayisi() {
return this.tekerlekSayisi;
}
public String toString() {
return super.toString() + " - KaraTasiti";
}
}
Kod 5-73. toString() yteminin geersiz klnmas KaraTasiti snf
package kalitim;
public class MotorsuzKaraTasiti extends KaraTasiti {
public MotorsuzKaraTasiti(int tekerlekSayisi) {
super(tekerlekSayisi);
}
public String toString() {
return super.toString() + " - MotorsuzKaraTasiti";
}
}
Kod 5-74. toString() yteminin geersiz klnmas MotorsuzKaraTasiti snf
package kalitim;
public class Bisiklet extends MotorsuzKaraTasiti {
public Bisiklet(int tekerlekSayisi) {
super(tekerlekSayisi);
}
public String toString() {
return super.toString() + " - Bisiklet";
}
}
Kod 5-75. toString() yteminin geersiz klnmas Bisiklet snf
package kalitim;
public class Program {
public static void main(String[] args) {
Bisiklet bisiklet = new Bisiklet(2);
System.out.println("Bisiklet'in bilgileri: " + bisiklet);

Tasit tasit = new Tasit();
System.out.println("Tasit'in bilgileri: " + tasit);
}
}
Kod 5-76. toString() yteminin geersiz klnmas Program snf
Program snfnda, nesneleri ekrana yazdran satrlara bakalm. Bu
satrlarda toString() yntemi aktan arlmad halde, Stringten
sonra kullanlan + ileci bititirme ilemi yapt iin Bisikletin
bilgileri: Stringinden sonra gelen + ileci, bisiklet nesnesinin
toString() ynteminin gizlice arlmasn salar. Ayn ekilde tasit
nesnesinin de toString() yntemi arlmaktadr. Programn kts
aadaki gibi olacaktr:
Bisiklet'in bilgileri: Tasit - KaraTasiti - MotorsuzKaraTasiti - Bisiklet
Tasit'in bilgileri: Tasit
kt 5-10. toString() yteminin geersiz klnmas Program kts
5.6 okbiimlilik (Polymorphism)
Nesneye ynelik programlamann 3. arac okbiimliliktir.
okbiimlilik, nesneye ynelik yaklamla gelitirilen uygulamalarn
geniletilebilirliini (extensibility) salayan ok nemli bir aratr.
Bu blmde okbiimliliin nasl gerekletirildii aklanacaktr.
5.6.1 Ata Snf Referansndan Alt Snf Nesnesine Ulama
Eer KaraTasiti snf Tasit snfnn alt snf olarak tanmlanmsa, Her
KaraTasiti bir Tasittir nermesi doru olmaldr. yleyse Tasit
snfndan tanmlanm bir referans deikenin KaraTasiti snfna ait bir
nesneyi gstermesi de mantksal olarak doru olacaktr. Nesneye ynelik
programlama dilleri de bu mantksal yaklam desteklemektedir:
package cokbicimlilik;
public class Calgi {
}
Kod 5-77. Ata snftan alt snf nesnesine eriim Calgi snf
package cokbicimlilik;
public class TelliCalgi extends Calgi {
}
Kod 5-78. Ata snftan alt snf nesnesine eriim TelliCalgi snf
package cokbicimlilik;
public class Gitar extends TelliCalgi {
}
Kod 5-79. Ata snftan alt snf nesnesine eriim Gitar snf
package cokbicimlilik;
public class Program {
public static void main(String[] args) {
Calgi calgi1 = new Gitar();
TelliCalgi calgi2 = new Gitar();
Calgi calgi3 = new TelliCalgi();
}
}
Kod 5-80. Ata snftan alt snf nesnesine eriim Program snf
Bu rnekte 3 derinlikte bir kaltm aac grlmektedir: Calgi snfnn alt
snf olan TelliCalgi snf ve onun da alt snf olan Gitar snf. Program
snfnda ise tane nesne oluturulmaktadr. Program herhangi bir ilem
gerekletirmemektedir. Ama yalnzca, ata snftan tanmlanan
referanslar ile alt snfa ait olarak oluturulan nesnelerin tutulabildiini
gstermektir.
5.6.2 Ge Balama (Late Binding)
Yapsal programlama dillerinde, derleyici (compiler) tarafndan herbir ilev
iin ayr bir ar oluturulur ve balayc (linker) bu arlar iletilecek
kod iin mutlak adreslere dntrr (Bkz. ekil 4.1). Bu sayede,
altrlabilir dosya olutuunda btn ilev arlar ile ilgili adresler
belirlidir. Buna erken balama (early binding) ad verilir.
Nesneye ynelik programlarda ise yntem arlar nesnelere gnderilen
iletilerden oluur. Nesneler alma zamannda oluturulduklar iin
yntem arlarnn hangi adreslerde olaca alma zamanna kadar
bilinemez.
Bu nedenle nesneye ynelik programlama dilleri, reysel (generic) bir tr
zerinden yntem arlmasna izin verir. Derleyici, yle bir yntemin var
olup olmad, parametrelerin ve dn deerlerinin tr denetimlerini
gerekletirebilir ancak yntem arsnn hangi nesne zerinden
iletilecei alma zamannda belirlenir. Dolaysyla hangi kodun
iletilecei derleme zamannda bilinmemektedir. Buna ge balama (late
binding) ad verilir.
Baz programlama dillerinde ge balama yaplacan programcnn
kodlayaca anahtar szckler belirlerken (C++ dilindeki virtual anahtar
szc gibi), Javada btn yntem arlar iin varsaylan yaklam ge
balamann kullanlmasdr. Dolaysyla Javada ge balama iin herhangi
bir zel anahtar szce gereksinim yoktur.
5.6.3 okbiimlilik Nasl Gerekleir?
imdi bir kod rnei ile bu anlattklarmz birletirelim.
package cokbicimlilik;
public class Calgi {
public void cal() {
System.out.println("Ses..");
}
}
Kod 5-81. okbiimlilik rnei Calgi snf
package cokbicimlilik;
public class TelliCalgi extends Calgi {
}
Kod 5-82. okbiimlilik rnei TelliCalgi snf
package cokbicimlilik;
public class Gitar extends TelliCalgi {
public void cal() {
System.out.println("Gitar sesi..");
}
}
Kod 5-83. okbiimlilik rnei Gitar snf
package cokbicimlilik;
public class Program {
public static void main(String[] args) {
Calgi calgi = new Calgi();
calgi.cal();

calgi = new Gitar();
calgi.cal();
}
}
Kod 5-84. okbiimlilik rnei Program snf
Grld gibi Calgi snf, onun alt snf olan TelliCalgi snf ve onun
alt snf olan Gitar snf tanmlanm. Calgi snfnda tanmlanan cal()
yntemi Gitar snfnda geersiz klnm.
Program snfnda nce Calgi snfndan bir referans deiken tanmlanm
ve bu referans deikenin iine Calgi snfna ait bir nesnenin referans
koyulmu. Daha sonra da bu referans deiken kullanlarak cal() yntemi
arlm. Ekranda Ses.. ktsnn olumasn bekliyoruz.
Sonraki satrda ayn referans deikene bir Gitar nesnesinin referans
aktarlm. Bunun olanakl olduunu, yani ata snf trnden tanmlanan
bir referans deikenin iinde alt snfa ait bir nesnenin referansnn
saklanabileceini sylemitik. Daha sonra bu referans zerinden cal()
yntemi arlm.
Burada koda iki farkl noktadan tekrar bakalm.
Derleyici asndan: elimizdeki referans deikenin tr Calgi
snfdr. yleyse bu deiken ile yalnzca Calgi snfnda bulunan
(Calgi snfnn iine kodlanan ya da Calgi snfnn kendi st
snflarndan ald) yntemler arlabilir. Dolaysyla, calgi.cal()
ynteminin derleme hatasna neden olmamas iin, Calgi snfnn
iinde cal() ynteminin tanmlanm olmas gerekir. Gerekten de
Calgi snfndan byle bir yntem tanmlanm olduuna gre bu
yntem arsnda herhangi bir sorun yoktur.
Ge balama asndan: referans deikenin tr Calgi snf olsa
da gsterdii yerde Gitar snfnn nesnesi bulunmaktadr. Hangi
yntemin arlaca alma zamannda belli olduuna ve alma
zamannda bir Gitar nesnesi bulunduuna gre, calgi.cal()
yntem ars, calgi referans deikeninin gsterdii yerde
bulunan Gitar nesnesi zerinden iletilecek demektir. Gitar
nesnesi ise Gitar snfna aittir ve bu snfn iinde cal() yntemi
kodlanmtr. yleyse bu satrn kts Gitar sesi.. eklinde
olacaktr.
Bu durumu aadaki ekille aklamaya alalm:

ekil 5-14. Yntemin alma zamannda oluturulan nesne zerinden iletilmesi
Programn kts u ekilde olacaktr:
Ses..
Gitar sesi..
kt 5-11. okbiimlilik rnei Program kts
Dikkat edilirse, calgi.cal(); deyimi iki satrda bulunmaktadr ve bu iki
satr iletildiinde ayn deyim almasna ramen birbirinden farkl kt
retilmitir. Yani ayn deyim, birden fazla biimde almaktadr.
Dolaysyla bu duruma okbiimlilik ad verilmektedir.
Soru:
Geri kalan kodlarda herhangi bir deiiklik yapmadan yalnzca Gitar
snfnda deiiklik yaplsa ve Gitar snfnda cal() yntemi geersiz
klnmasa ne olur? Yani Gitar snfmzn kodu aadaki gibi olsa program
derleme hatas verir mi? Vermezse programn kts ne olur?
package cokbicimlilik;
public class Gitar extends TelliCalgi {
}
Kod 5-85. okbiimlilik rnei Gitar snfnda cal() yntemi geersiz klnmyor
Yant:
Kodu derleyip iletmeden nce bildiklerimizi kullanarak ne olacan
sylemeye alalm:
Calgi calgi = new Calgi();
calgi.cal();
kesiminin gene ayn ekilde alacan biliyoruz.
calgi = new Gitar();
calgi.cal();
kesiminde ise gene derleyici asndan herhangi bir sorun bulunmuyor. Ge
balama kavramn dndmzde, cal() ynteminin gene Gitar
snfndan bir nesne zerinden iletileceini biliyoruz. Ancak bu sefer Gitar
snfnda cal() yntemi geersiz klnmadna gre, atadan gelen cal()
yntemi iletilecektir. Gitar snfnn dorudan atas olan TelliCalgi
snfnda da cal() yntemi kodlanmam olduuna gre bu yntem Calgi
snfndan gelen cal() yntemi olacaktr. yleyse programn kts u
ekilde olmaldr:
Ses..
Ses..

okbiimliliin gerekleebilmesi iin;
1- Kaltm ilikisi tanml olmal
2- Ata snf trnden tanmlanm referans deiken ile alt snf trnden
oluturulmu nesneye ulalmal
3- Alt snf, atasndaki yntem(ler)i geersiz klm olmaldr.
Soru:
imdi Gitar snfmza cal() yntemini yeniden kodlayalm ve bu sefer
Calgi snfndan cal() yntemini silelim. Program snfnda da main()
ynteminin ilk iki satrn silip kodu u duruma getirelim:
package cokbicimlilik;
public class Calgi {
}
Kod 5-86. Soru Calgi snf
package cokbicimlilik;
public class TelliCalgi extends Calgi {
}
Kod 5-87. Soru TelliCalgi snf
package cokbicimlilik;
public class Gitar extends TelliCalgi {
public void cal() {
System.out.println("Gitar sesi..");
}
}
Kod 5-88. Soru Gitar snf
package cokbicimlilik;
public class Program {
public static void main(String[] args) {
Calgi calgi = new Gitar();
calgi.cal();
}
}
Kod 5-89. Soru Program snf
Bu kodun ne yapmasn beklersiniz?
Yant:
Derleyici asndan baktmzda, Program snfnn iindeki
calgi.cal();
satrnda hata olduunu syleyebiliriz. nk calgi referans Calgi
snfna aittir ve derleme zamannda bu referansn hangi nesneyi
gsterecei belli deildir. yleyse Gitar snfnda cal() ynteminin
bulunmas ve alma zamannda Gitar nesnesi zerinden cal()
ynteminin iletilecek olmas, derleyici asndan nemli deildir. nemli
olan Calgi snfnda cal() ynteminin bulunmamasdr. Referans
deikenin ait olduu snfta ya da onun ata snflarndan herhangi
birisinde byle bir yntem olmad iin derleyici bu yntem arsna izin
vermeyecektir:

5.6.4 okbiimlilik Ne e Yarar?
okbiimlilik, ne yaplaca ile nasl yaplacan birbirinden ayrmaktadr.
nk her alt snf, ata snftaki bir yntemi geersiz kldnda o yntemi
daha zel bir ekilde gerekletiriyor demektir. Dolaysyla iin nasl
yaplaca alt snfla birlikte deimektedir. Ata snf tipinden referans
zerinden yaplan yntem ars ise ne yaplacan belirler. calgi.cal();
deyimi, bir algnn almasn istemektedir; ne yaplaca bellidir. Ancak o
algnn ne olduu ve nasl alaca ancak alma zamannda belirlenmi
olacaktr.
okbiimlilik uygulamalarn geniletilebilirliini salar. Derleme zamannda
ne yaplacann belli olmas, o iin nasl yaplacann ise alma
zamannda oluturulan nesne ile birlikte belirlenmesi, gelitirilen sisteme
yeni nasllar eklenmesini kolaylatrr.
okbiimlilik sayesinde, bir ata snfn sunduu yntemleri geersiz klan
alt snflar yardm ile ata snfa gre kodlanm tek bir kod kesimine farkl
davranlar yklemek olanakl olmaktadr. yleyse, elimizde devingen
olarak davran deitirilebilen bir altyap var demektir. Bu devingen
altyapya yeni trlerin eklenmesi, kaltm ve geersiz klma ilikileri
erevesinde olduka kolaydr.
okbiimliliin ne ie yaradn anlatmann en kolay yolunun, okbiimlilik
olmasayd nasl kod yazlmas gerektiini gstermek olduunu
dnyorum. Bu nedenle nce okbiimlilik mekanizmasnn olmadn
varsayarak rnek bir program yazacaz. Ancak hemen ncesinde soyut
snflardan bahsetmeliyiz. nk kaltm ve okbiimlilik kavramlar soyut
snflar olmadan dnlemez.
okbiimlilik ne yaplaca ile nasl yaplacan birbirinden ayrarak, kodun
geniletilebilirliini salar.
5.6.5 Soyut Snflar (Abstract Classes)
alglarla ilgili olarak gerekletirdiimiz okbiimlilik rneimize geri
dnelim:
Btn alglar iin cal() ynteminin tanmlanmasnn anlaml olduu
aktr. yleyse kaltm aacnn en stnde bulunan Calgi snfnda cal()
yntemini kodlamalyz. Peki bu yntemin gerekletirimini
(implementation) nasl yapacaz?
Bir yntemin gerekletirimi, { iareti ile balayp } iareti ile biten
kesimdir. Bu kesime yntemin gvdesi (method body) de denir. Yntemin
dndrecei deerin tr, yntemin ad ve parametrelerini belirten kesime
ise yntem bildirimi (method declaration) ad verilir.
void yontem(int param1, String param2) yntemin bildirimi
{
.... yntemin gvdesi / yntemin gerekletirimi
}
Calgi snf btn alglarn ata snfdr. alg dendii zaman herkesin
aklnda bir alg canlanmaktadr. Ancak Calgi snfnda cal() yntemini
kodlamak istediimizde, gereki bir gerekletirim yapamayz. rnein
eer bilgisayarn ses kartndan ses verebilen bir gerekletirim yapyor
olsaydk, Calgi snfnn iindeki cal() ynteminin ses kartndan nasl bir
ses vermesi gerektiine karar veremeyecektik. nk alma eylemi,
algnn trne gre belli olacaktr. Bir gitar ile bir fltn ayn ekilde ses
veremeyecei dnlrse, bunlarn ata snf olan Calgi snfnda
kodlanacak yntem gvdesinin aslnda alma eylemi ile ilgisi olmayan,
dolaysyla ok da anlaml olmayan bir kod kesimi olaca grlr.
Eer bir snftaki herhangi bir yntem iin anlaml bir gerekletirim
tanmlanamyorsa, o yntem iin gerekletirimin kodlanmas zorunlu
deildir. Snfn iinde yntemin yalnzca bildirimi bulunabilir. Byle
tanmlanan yntemlere soyut yntem (abstract method) ad verilir ve bir
yntemin soyut olduunu belirtmek iin abstract anahtar szc
kullanlr.
Eer bir snfn iindeki yntemlerden en az bir tanesi soyut yntemse,
snf da soyut tanmlanmaldr.
Aadaki rnekte Calgi snfnn cal() yntemi soyut tanmlanm,
dolaysyla Calgi snf da soyut olarak belirtilmitir:
public abstract class Calgi {
public void abstract cal();
}
Kod 5-90. abstract yntem tanmlama
Bir snfn soyut olmas, o snfn nesnesinin oluturulamamasnn derleyici
tarafndan denetlenmesini salar. Eer kodun herhangi bir yerinde bir
soyut snfn nesnesini oluturmak zere kod yazlmsa, derleyici bu kod
kesimine hata verecektir.
public class Program {
public static void main(String[] args) {
Calgi calgi = new Calgi(); // derleme hatas
}
}
Kod 5-91. Soyut snfn nesnesinin oluturulamamas
Soyut snf, nesnesi oluturulamayan/oluturulamamas gereken snftr.
Adndan da anlalaca zere soyut snf, soyut olarak kalmak zere
kodlanm bir snftr. Nesne oluturmak ise snf somutlatrmak olacaktr.
Eer soyut snfn nesnesi oluturulabilseydi, o nesne zerinden soyut
tanmlanm olan yntemin de arlabilmesi olanakl olurdu. Ancak
yntemin soyut tanmlanmasnn nedeni zaten ynteme bir
gerekletirimin kodlanamam olmasdr. yleyse, soyut snfn nesnesinin
oluturulabilmesi, snfn ve o snfn yntem(ler)inin soyut tanmlanma
gerekesi ile elimektedir.
Soyut snf neden tanmlanr?
Soyut yntemin gerekletirimi kodlanmadna ve soyut snfn nesnesi
oluturulamadna gre byle bir snf ve snfa ait yntem(ler) neden
kodlanmaktadr?
Konunun balangcnda da belirttiimiz gibi soyut snf aslnda kaltm
hiyerarisinde yeri olan, modelin tasarm iin mantksal gereklilii bulunan
bir snftr. Nesneye ynelik modeldeki btn snflarn nesnelerinin
oluturulmas gibi bir zorunluluk yoktur. nemli olan mantksal olarak
doru bir model oluturmak, snflar arasndaki ilikileri doru
tanmlamaktr. Snfn soyut olmas ise bir sonraki aamada, snfn
yntemlerinin kodlanmas srasnda ortaya kmaktadr. alg rneinde
Calgi snf gibi bir ata snfn olmamas dnlemez. Ata snfta doal
olarak btn alt snflarda ortak olan nitelik ve yntemler bulunacaktr.
Ancak btn yntemlerin gerekletirimlerinin kodlanmas zorunlu
olmad gibi olanakl da olmayabilir.
Soyut snflar okbiimlilik ilkesinin gerekletirilmesinde nemli bir yere
sahiptir. Ge balama ve kaltm sayesinde, ata snf referans zerinden
yaplan yntem arlarnn okbiimlilii meydana getirdiini biliyoruz. Bir
yntemin soyut tanmlanmas, o snfn alt snf(lar)nda bu yntemin
gerekletiriminin kodlanmasn, yani geersiz klnmasn zorlar. nk
eer alt snf ata snftan ald soyut yntemi geersiz klmyorsa, o zaman
alt snfta soyut bir yntem var demektir. Bu durumda alt snfn da soyut
tanmlanmas gerekecektir ve nesnesi oluturulamaz. Yntemin
arlabilmesi iin ise nce nesne oluturulmas gerekir (static yntemler
bu ifadenin dndadr). yleyse eer bir yntem arlabiliyorsa, yntemin
iinde bulunduu snfn nesnesi oluturulmu demektir. Nesne
oluturulabildiine gre soyut tanmlanm yntem(ler) alt snfta geersiz
klnm olmaldr. Bylece, ata snf referans zerinden soyut yntem
ars yaplarak okbiimlilik gerekletirilmi olur.
okbiimliliin ise kodun geniletilebilirliine nasl katkda bulunduundan
bahsetmitik. Soyut snflar, okbiimlilii zorlayarak kodun
geniletilebilirliini arttrmak zere kullanlabilirler. Genellikle bir tasarmn
geniletme noktalar olarak dnlen ksmlar soyut yntemler olarak
tanmlanr ve bu tasarma eklenecek olan snflarn, soyut yntemleri
ieren snfn alt snf olarak kodlanmalar ve soyut yntemleri geersiz
klmalar beklenir. Bylece, ata snf referanslar ile alacak ekilde
tasarlanan uygulamann, soyut tanmlanan yntemler iin alt snflarda
anlaml gerekletirimler bulmas garanti edilmi olur.
rnek Senaryo:
Bir giyim maazasnda alan kiilerin maalarn ekrana yazdracak bir
program gelitireceiz. alanlarn maalar, grevlerine gre farkl
ekillerde hesaplanyor:
Mdr: Aylk 2.000 YTL maa + prim ile alyor. Prim ise toplam sat
tutarna gre hesaplanyor. O ayki tutarn 20.000 TLyi gemesi
durumunda, 20.000 TLden fazla olan miktarn %10u kadar prim alyor.
Tezgahtar: Prim ile alyor. Yapt aylk toplam satn %10unu alyor.
dari Personel: Aylk 800 TL sabit maa ile alyor.
Hizmetli: Saatlik cret ile alyor. Saat creti 10 TL.
Maazada 1 mdr, 2 tezgahtar, 2 idari personel ve 2 hizmetli alyor.
Ay sonunda kimin ne kadar sat yapt ya da ka saat alt sisteme
girilecek ve herkesin almas gereken maa, kiinin yapt i, ad ve soyad
ile birlikte ekranda grlecek.
Not: alanlar ile ilgili bilgileri kullancnn girmesi gerekmiyor. Bu bilgileri
rnek programn iinde kodlayabiliriz. Ama bu program bir maazada
kullanmak deil, yalnzca baz kavramlar kullanarak tasarm yapmak.
1. zm: Her farkl alan tr iin ayr bir snf ve bu snflarn
kullanln rnekleyen kk bir program rnei kodlayalm:
package cokbicimlilik.soyutsiniflar.magaza.cozum1;
public class Mudur {
private String ad;
private String soyad;
private int maas;

public Mudur(String ad, String soyad) {
this.ad = ad;
this.soyad = soyad;
}
public String getAd() {
return ad;
}
public String getSoyad() {
return soyad;
}
public void setMaas(int maas) {
this.maas = maas;
}
public String getBilgi() {
return "Mdr: " + this.ad + " " + this.soyad +
", bu ay " + this.maas + " YTL alacaktr.";
}
}}
Kod 5-92. Soyut snf rnei, 1. zm Mudur snf
package cokbicimlilik.soyutsiniflar.magaza.cozum1;
public class Hizmetli {

private String ad;
private String soyad;
private int maas;

public Hizmetli(String ad, String soyad) {
this.ad = ad;
this.soyad = soyad;
}
public String getAd() {
return ad;
}
public String getSoyad() {
return soyad;
}
public void setMaas(int maas) {
this.maas = maas;
}
public String getBilgi() {
return "Hizmetli: " + this.ad + " " + this.soyad +
", bu ay " + this.maas + " YTL alacaktr.";
}
}
Kod 5-93. Soyut snf rnei, 1. zm Hizmetli snf
package cokbicimlilik.soyutsiniflar.magaza.cozum1;
public class Tezgahtar {
private String ad;
private String soyad;
private int maas;

public Tezgahtar(String ad, String soyad) {
this.ad = ad;
this.soyad = soyad;
}
public String getAd() {
return ad;
}
public String getSoyad() {
return soyad;
}
public void setMaas(int maas) {
this.maas = maas;
}
public String getBilgi() {
return "Tezgahtar: " + this.ad + " " + this.soyad +
", bu ay " + this.maas + " YTL alacaktr.";
}
}
Kod 5-94. Soyut snf rnei, 1. zm Tezgahtar snf
package cokbicimlilik.soyutsiniflar.magaza.cozum1;
public class IdariPersonel {
private String ad;
private String soyad;
private int maas;

public IdariPersonel(String ad, String soyad) {
this.ad = ad;
this.soyad = soyad;
}

public String getAd() {
return ad;
}
public String getSoyad() {
return soyad;
}
public void setMaas(int maas) {
this.maas = maas;
}
public String getBilgi() {
return "dari Personel:" + this.ad + " " + this.soyad +
", bu ay " + this.maas + " YTL alacaktr.";
}
}
Kod 5-95. Soyut snf rnei, 1. zm IdariPersonel snf
package cokbicimlilik.soyutsiniflar.magaza.cozum1;
public class Magaza {
private final static int MUDUR_CIPLAK_MAASI = 2000;
private final static int MUDUR_PRIM_LIMITI = 20000;
private final static int HIZMETLI_SAATLIK_UCRET= 10;
private final static int IDARI_PERSONEL_MAASI = 800;

public static void main(String[] args) {

Hizmetli[] hizmetliler = new Hizmetli[2];
hizmetliler[0] = new Hizmetli("Ali", "Kaya");
hizmetliler[0].setMaas(HIZMETLI_SAATLIK_UCRET * 60);
hizmetliler[1] = new Hizmetli("Ahmet", "Ate");
hizmetliler[1].setMaas(HIZMETLI_SAATLIK_UCRET * 40);

IdariPersonel[] idariPersoneller = new IdariPersonel[2];
idariPersoneller[0] = new IdariPersonel("Aye", "Demir");
idariPersoneller[0].setMaas(IDARI_PERSONEL_MAASI);
idariPersoneller[1] = new IdariPersonel("Mehmet", "elik");
idariPersoneller[1].setMaas(IDARI_PERSONEL_MAASI);

Tezgahtar[] tezgahtarlar = new Tezgahtar[2];
tezgahtarlar[0] = new Tezgahtar("Okan", "Yeil");
tezgahtarlar[0].setMaas(15000 / 10);
tezgahtarlar[1] = new Tezgahtar("Burcu", "Semen");
tezgahtarlar[1].setMaas(22000 / 10);

Mudur mudur = new Mudur("Furkan", "Kartal");
mudur.setMaas((37000 - MUDUR_PRIM_LIMITI) / 10 +
MUDUR_CIPLAK_MAASI);


System.out.println("alanlarn maalar:");
System.out.println(mudur.getBilgi());
for (int i = 0; i < tezgahtarlar.length; ++i) {
System.out.println(tezgahtarlar[i].getBilgi());
}
for (int i = 0; i < idariPersoneller.length; ++i) {
System.out.println(idariPersoneller[i].getBilgi());
}
for (int i = 0; i < hizmetliler.length; ++i) {
System.out.println(hizmetliler[i].getBilgi());
}
}
}
Kod 5-96. Soyut snf rnei, 1. zm Magaza snf
alanlarn maalar:
Mdr: Furkan Kartal, bu ay 3700 YTL alacaktr.
Tezgahtar:Okan Yeil, bu ay 1500 YTL alacaktr.
Tezgahtar:Burcu Semen, bu ay 2200 YTL alacaktr.
dari Personel:Aye Demir, bu ay 800 YTL alacaktr.
dari Personel:Mehmet elik, bu ay 800 YTL alacaktr.
Hizmetli:Ali Kaya, bu ay 600 YTL alacaktr.
Hizmetli:Ahmet Ate, bu ay 400 YTL alacaktr.
kt 5-12. Soyut snf rnei, 1. zm Programn kts
imdi bu zm deerlendirmeye alalm:
1- Mudur, IdariPersonel, Tezgahtar ve Hizmetli snflar incelenirse, bu
snflardaki kodun ounun ayn ii yapt ancak her snfta yeniden
kodland grlr. Bunun yerine btn bu snflar Calisan gibi bir ata
snftan kaltm ilikisi ile hem nitelikleri hem de o nitelikler zerinde ilem
yapan yntemleri alabilirlerdi.
Kod tekrar istenen birey deildir. nk kod tekrar kodun bakm
kolayln kt ynde etkiler. Herhangi bir deiiklik yaplmas sz konusu
olduunda, kodun btn tekrarlarnn elden geirilmesi gerekir. Bu da doal
olarak kodun bakm maliyetini arttraca gibi eksik kalan, unutulan
deiiklikler sonucunda tutarsz ve hata ieren programlarn ortaya kmas
olasl artar. Kodu tekrarlamamak iin yaplabileceklerden birincisi, ayn ii
yapan kod kesimlerinin ilevler ierisine koyulup, kodun kopyalanmas
yerine ilevin arlmasdr. Nesneye ynelik programlamada ise kaltm ya
da ierme ilikileri ile kodun yeniden kullanlmas salanabilir.
2- Magaza snfnda, btn alanlar iin ayr ayr diziler tanmland
grlmektedir. Her dizi belli bir tipteki alanlar tutmaktadr. alanlarn
maalarnn ekrana dklmesi iin de bu diziler zerinden ayr ayr
geilmesi gerekmektedir. imdi bu koda MudurYardimcisi snfn
eklediimizi ve onun da maann farkl bir ekilde hesaplandn
dnelim. Bu durumda Magaza snfnda MudurYardimcisi[] eklinde
yeni bir dizi tanmlamamz, bu dizinin zerinden geecek yeni bir kod
kesimi daha yazmamz gerekecektir. Oysa eer 1. maddede bahsedilen
kaltm ilikisi kurulsayd, btn alanlar ata snf trnden tanmlanm
bir dizide (Calisan[]) saklanabilirdi. Calisan snfna maasHesapla() gibi
bir yntem tanmlanr ve maalar ekrana dken kesim bu dizi zerinden
alan tek bir dng olabilirdi. Bylece MudurYardimcisi gibi yeni bir snf
eklendiinde kodda herhangi bir deiiklik yaplmas gerekmezdi.
3- Magaza snf, btn alan trlerinin maalarn hesaplama bilgisinin
kodland yer olarak grlyor. Oysa her snf kendi snfna zel maa
hesaplama ilemini yaparsa, rnein bir mdrn maann hesaplan
Mudur snf iinde kodlanrsa, kodun daha kolay ynetilebilmesi salanr.
Bir MudurYardimcisi snf eklendiinde, bu snfa zel maa hesaplama
bilgisinin de Magaza snfna kodlanacak olmas gzel bir yaklam
olmayacaktr.
2. zm: imdi bu bilgiler nda kaltm ilikisini de kurarak snflar
yeniden kodlayalm:
ncelikle Calisan adl bir ata snf tanmlayarak, btn alt snflarda
bulunan kod kesimlerini bu snfn iine alacaz. 1. zm ile ilgili
deerlendirmemizin 2. ve 3. maddelerinde belirttiimiz gibi maa
hesaplama ilemlerini de her snfn kendisine zel yapacaz. Bu durumda,
Calisan adl ata snfa, btn alt snflarda geersiz klnmasn istediimiz
maasHesapla() yntemini tanmlayacaz. Ancak bu yntemin
gerekletirimini (yntem gvdesini) nasl ve neye gre kodlamalyz?
Calisan snf btn alanlarn ata snf olduuna ve alann tr
zellemedii (alt snf) srece maann nasl hesaplanaca bilinmediine
gre, Calisan snfndaki maasHesapla() ynteminin gerekletirimini
yapamayacaz (ya da hibirey yapmayan, ii bo bir yntem gvdesi
yazacaz ancak anlaml olmayacak!). yleyse maasHesapla() yntemini
soyut olarak tanmlamalyz. Bu durumda Calisan snf da soyut olacaktr.
package cokbicimlilik.soyutsiniflar.magaza.cozum2;
public abstract class Calisan {
private String ad;
private String soyAd;

public Calisan(String ad, String soyAd) {
this.ad = ad;
this.soyAd = soyAd;
}
public String getAd() {
return ad;
}
public String getSoyAd() {
return soyAd;
}
public abstract int maasHesapla();

public String getBilgi() {
return this.kimimBen() + ": " + this.ad + " " + this.soyAd +
", bu ay " + this.maasHesapla() + " YTL alacaktr.";
}
public abstract String kimimBen();
}
Kod 5-97. Soyut snf rnei, 2. zm Calisan snf
Btn alan trleri iin ortak olan ad ve soyad nitelikleri, bunlarn get
yntemleri ve maasHesapla() yntemini Calisan snfnn iinde kodladk.
Ayrca yine Calisan snfnda bir de getBilgi() yntemi olduu
grlyor.
nceki zm incelenirse, btn alan trleri iin ortak olan bir baka
yntemin de getBilgi() yntemi olduu grlr. Ancak getBilgi()
yntemini ata snfa kodlarsak, alann mdr m, tezgahtar m yoksa
hizmetli mi olduunu nasl ayrdedeceimiz sorunu ortaya kar. te bu
sorunu zebilmek iin Calisan snfna soyut bir yntem daha tanmladk:
kimimBen() yntemi. Bu yntem soyut tanmland nk hem ata snfta
bu yntemin kodlanmas iin gerekli ve yeterli bilgi yoktur, hem de bu
yntemin alt snflarda mutlaka geersiz klnmas gereklidir. Bylece
getBilgi() yntemi iletilirken, alma zamannda hangi nesne
zerinden arlmsa o nesnenin ne tipte bir alana ait olduunu
dndrebilecektir.
package cokbicimlilik.soyutsiniflar.magaza.cozum2;
public class Mudur extends Calisan {
private static final int CIPLAK_MAAS = 2000;
private static final int CIPLAK_MAAS = 2000;
private static final int PRIM_LIMITI = 20000;

private int satis;

public Mudur(String ad, String soyad){
super(ad, soyad);
}

public void setToplamSatis(int satis) {
this.satis = satis;
}

public int maasHesapla() {
if (this.satis > Mudur.PRIM_LIMITI) {
return CIPLAK_MAAS +
(this.satis - Mudur.PRIM_LIMITI) / 10; }
return CIPLAK_MAAS;
}

public String kimimBen() {
return "Mdr";
}
}
Kod 5-98. Soyut snf rnei, 2. zm Mudur snf
package cokbicimlilik.soyutsiniflar.magaza.cozum2;
public class Hizmetli extends Calisan {
private static final int SAAT_UCRETI = 10;
private int mesaiSaati;

public Hizmetli(String ad, String soyad){
super(ad, soyad);
}

public void setMesaiSaati(int mesaiSaati) {
this.mesaiSaati = mesaiSaati;
}

public int maasHesapla() {
return this.mesaiSaati * Hizmetli.SAAT_UCRETI;
}

public String kimimBen() {
return "Hizmetli";
}
}
Kod 5-99. Soyut snf rnei, 2. zm Hizmetli snf
package cokbicimlilik.soyutsiniflar.magaza.cozum2;
public class Tezgahtar extends Calisan {
private int satis;

public Tezgahtar(String ad, String soyad){
super(ad, soyad);
}

public void setSatis(int satis) {
this.satis = satis;
}

public int maasHesapla() {
return this.satis / 10;
}

public String kimimBen() {
return "Tezgahtar";
}
}
Kod 5-100. Soyut snf rnei, 2. zm Tezgahtar snf
package cokbicimlilik.soyutsiniflar.magaza.cozum2;
public class IdariPersonel extends Calisan {
private static final int MAAS = 800;

public IdariPersonel(String ad, String soyad){
super(ad, soyad);
}

public int maasHesapla() {
return IdariPersonel.MAAS;
}

public String kimimBen() {
return "dari Personel";
}
}
Kod 5-101. Soyut snf rnei, 2. zm IdariPersonel snf
package cokbicimlilik.soyutsiniflar.magaza.cozum2;
public class Magaza {

public static void main(String[] args) {
Calisan calisanlar[] = new Calisan[7];

calisanlar[0] = new Mudur("Furkan", "Kartal");
((Mudur)calisanlar[0]).setToplamSatis(37000);

calisanlar[1] = new Tezgahtar("Okan", "Yeil");
((Tezgahtar) calisanlar[1]).setSatis(15000);
calisanlar[2] = new Tezgahtar("Burcu", "Semen");
((Tezgahtar) calisanlar[2]).setSatis(22000);

calisanlar[3] = new IdariPersonel("Aye", "Demir");
calisanlar[4] = new IdariPersonel("Mehmet", "elik");

calisanlar[5] = new Hizmetli("Ali", "Kaya");
((Hizmetli) calisanlar[5]).setMesaiSaati(60);
calisanlar[6] = new Hizmetli("Ahmet", "Ate");
((Hizmetli) calisanlar[6]).setMesaiSaati(40);

System.out.println("alanlarn maalar:");
for (int i = 0; i < calisanlar.length; ++i) {
System.out.println(calisanlar[i].getBilgi());
}
}
}
Kod 5-102. Soyut snf rnei, 2. zm Magaza snf
alanlarn maalar:
Mdr: Furkan Kartal, bu ay 3700 YTL alacaktr.
Tezgahtar: Okan Yeil, bu ay 1500 YTL alacaktr.
Tezgahtar: Burcu Semen, bu ay 2200 YTL alacaktr.
dari Personel: Aye Demir, bu ay 800 YTL alacaktr.
dari Personel: Mehmet elik, bu ay 800 YTL alacaktr.
Hizmetli: Ali Kaya, bu ay 600 YTL alacaktr.
Hizmetli: Ahmet Ate, bu ay 400 YTL alacaktr.
kt 5-13. Soyut snf rnei, 2. zm Programn kts
Grld gibi 2. zm de ayn kty retmektedir. Buna ek olarak, bu
yeni zme MudurYardimcisi gibi yeni bir tr ekleyebilmek iin
yapmamz gereken, bu snf Calisan snfndan kaltm ilikisi ile
zelletirmek ve ata snfta soyut tanmlanm yntemleri geersiz
klmaktan ibarettir. Maalarn ekrana dkld kod kesiminde baka
herhangi bir deiiklik yapmak gerekmeyecektir. Bunu salayan ara,
kaltm ve ge balama ile gerekletirilen okbiimlilik ve okbiimlilii
gerekletirecek olan yntemlerin geersiz klnmalarn zorlayan soyut
yntem ve soyut snf tanmlardr.
5.6.6 Arayzler (Interfaces)
Arayz denilince genelde herkesin aklna ilk nce kullanc arayzleri gelir
(GUI - Graphical User Interface). rnein Windows iletim sistemi
kullanyorsanz, bilgisayarnz atnzda ekrannzda grdkleriniz
Windowsun kullanc arayzdr. Bu arayz, fare ve klavye evre
birimlerini de kullanarak Windows ile etkileimde bulunabilmenizi salar.
Nesneye ynelik programlama balamnda ise arayz, kavramsal olarak
kullanc arayz ile benzer ii yapan bir ara olarak deerlendirilmelidir.
nce bu ii ve arayzn en genel ifade ile ne olduunu aklamaya
alalm. Sonra da Javada arayzlerin nasl kodlandna ve
kullanmlarna bakalm.
Arayz Kavram
Arayz temelde bir sistemin/alt sistemin baka sistem/alt sistemlerle
arasndaki iletiimin nasl olacan belirler. Bu, szkonusu olan arayz
ister kullanc arayz olsun, ister iki donanm arasndaki arayz olsun
mantksal olarak ayndr.
Bir programn kullanc arayz, kullanclarn o programdan nasl hizmet
alabileceini ve ne yapabileceklerini belirler. Burada program bir sistem,
kullanc ise o sistemden hizmet alan baka bir sistemdir. Kullanc
programn hangi dille kodlandn, kulland algoritmalar ya da veri
yaplarn bilmez. Kullanc sadece fare ile ekrann neresine tkladnda ne
olacan bilir. Baka bir deyile kullanc arayz bilir, tanr; ancak
arayzn arkasndaki ayrntlar bilemez, bilmesine de gerek yoktur.
Ekrandan gelen grnt kablosunun bilgisayara baland yuva,
bilgisayarn arayzlerinden birisidir. Bu arayz sayesinde, grnt
verebilecek herhangi bir donanm bilgisayara balanabilir. rnein ekran
yerine bir yanstc ile bilgisayardan gelen grnt bir perdeye aktarlabilir.
nemli olan o arayz tanyan/bilen bir donanm olmasdr. Bilgisayar
grnty reten sistem, bilgisayara balanan cihaz ise o grnty bir
ekilde gsterebilen baka bir sistemdir. Her iki sistem de birbirlerinin i
yaplarn bilmek durumunda deildir. Bilgisayar iin grntnn perdede,
LCD ekranda ya da CRT ekranda yanstlmasnn bir fark olmad gibi, bir
ekrann da grnty nasl bir bilgisayardan aldnn bir nemi yoktur.
Burada arayz iki sistem arasnda iletiimin nasl olacan belirleyen bir
szlemedir. Kablonun takld yuvadaki hangi inenin hangi anlama
gelecei bellidir ve bu arayze uygun olarak retilmi ok farkl
donanmlar bulunabilir.
Ksaca arayz bir sistemin baka sistemlerle iletiim kurmak/birlikte
almak iin sunduu bir szleme, bir btnleme noktasdr denilebilir.
Eer bir sistemi kullanmak istiyorsak o sistemin arayzn, arayznde
salanan yetenekleri uygun ekilde kullanmay renmemiz gerekir.
Bilgisayarn grnt aktarmak iin sunduu arayz, aslnda herbirinin bir
anlam olan elektrik imleri ileten inelerden olumaktadr. Bir cihaz
grnt almak zere bilgisayara balayabilmemiz iin bu imleri alabilmesi,
ald imleri bir ekilde grntye dntrmesi yeterlidir. Bu
dntrmeyi nasl yaptyla ilgilenmeyiz. Bu yaklamla, eer arayzn
gereini yerine getiriyorsa bir cep telefonunu da bilgisayarn ekran olarak
kullanma ansmz vardr.
Javada Arayzler
Arayzler programlama balamnda da sistemler arasnda btnleme
noktalar tanmlamak iin kullanlrlar. Buradaki sistemler programn bir
modln/alt sistemini oluturan snflara karlk gelmektedir.
Bir arayz, bir grup yntem bildiriminden (method declaration) oluan bir
szlemedir. Bu yntemler, arayz tanmlayan sistemin, kendisiyle
birlikte almak isteyen dier alt sistem(ler)in gerekletirmesini
(implement) bekledii yntemlerdir. Baka bir deyile, arayz tanmlayan
sistem, birlikte alabilecei dier sistemlerin neye benzemeleri
gerektiini belirtmektedir. Arayz bir szleme olduuna gre, bu arayz
zerinden sistemle btnleen dier sistem, szlemedeki btn
maddeleri yerine getirmeli yani arayzde bulunan btn yntemlerin
gerekletirimlerini (method implementation) salamaldr.
Bunu bir rnekle aklamaya alalm:
Bir izim program gelitirdiimizi ve ekrandaki nesneleri ynetecek bir
snf yazmak istediimizi dnelim. Ancak yazacamz snf yle
tasarlamalyz ki, sonradan eklenen herhangi bir snfn nesneleri ile de
alabilmeli.
Bu gereksinimleri karlamak zere, ekrandaki nesnelerin bir listesini
tutacak ve ekrandaki grnty yenilemesi gerektike bu listedeki btn
nesnelere ciz() iletisini gnderecek bir snf kodlayabiliriz:
public class SekilYoneticisi {
public static void main(String[] args) {
Sekil sekiller[];

// ......

// ekil nesnelerinin her birine ciz() iletisi gnder
for (int i = 0; i < sekiller.length; ++i) {
sekiller[i].ciz();
}

// ......
}
}
Kod 5-103. SekilYoneticisi snf
Tasarmmzn sonradan eklenecek snflarla birlikte alabilmesi iin de
aadaki gibi bir ata snf tanmlayp, ekranda izilmesi istenen btn
nesnelerin bu snfn alt snf olmasn zorlayabiliriz:
public abstract class Sekil {
public abstract void ciz();
}
Kod 5-104. Sekil snf
Bu tasarmn zemeyecei iki nemli sorun bulunmaktadr:
Birinci sorun, sisteme eklenmesi istenen her snfn Sekil snfnn alt snf
olmas zorunluluudur. Kaltm ilikisi is a ilikisi olduuna gre, Sekil
snfnn alt snf olmas istenen snflarn gerekten de birer ekil olmalar,
modelin doruluu iin bu ilikinin de mantksal adan doru olmas
gerekmektedir.
kinci sorun ise birinci sorun olarak ifade edilen mantksal zorlamann her
zaman olanakl olmamasndan kaynaklanr. nk ekranda izmek
istediimiz bir snf eer baka bir snfn alt snf ise Sekil snfnn alt
snf olamayacaktr. Dolaysyla mantksal iliki yapay bir ekilde
oluturularak birinci sorun alsa bile ikinci sorun alamayacaktr.
te yandan, aslnda herhangi bir snfn nesnesinin ekrana izilebilmesi iin
Sekil snfnn alt snf olmas deil, Sekil snfndaki ciz() yntemine
sahip olmas gerekmektedir. Zaten ciz() ynteminin abstract
tanmlanmasnn nedeni de budur. yleyse yeni tanmlanan bir snf
SekilYoneticisi ile kullanabilmemiz iin bize esas gerekli olan, bu snfn
ciz() ynteminin gerekletirimini yaptn garanti etmesidir. Baka bir
deyile, SekilYoneticisi ile birlikte almak isteyen snflarn, ciz()
ynteminden oluan bir szlemeye uymalar gerekir. Bu szleme ise bir
arayz olarak tanmlanacaktr.
Javada arayz tanm interface anahtar szc ile yaplr. Aada
Sekil arayznn tanm grlmektedir:
public interface Sekil {
void ciz();
}
Kod 5-105. Sekil.java
Herhangi bir snfn bir arayz ile belirlenen szlemeye uyduunu, yani o
arayzdeki yntemlerin gerekletirimlerini saladn ifade etmek iin ise
implements anahtar szc kullanlr. Aada, Sekil arayznn
gerekletirimini yapan A snf grlmektedir:
public class A implements Sekil {
public void ciz() {
// buraya A nesnelerini ekrana izen kod yazlacak
}
}
Kod 5-106. Sekil arayzn gerekletiren A snf
Bir snf ancak tek bir snftan zelletirilebilir. Yani extends anahtar
szcnden sonra yalnzca tek bir snfn ad yazlabilir ve o snfn alt
snf olunabilir. Ancak bir snfn hangi arayzleri gerekletirecei
konusunda bir snr yoktur. Bir snf tek bir snfn alt snf olabilirken,
birok arayz gerekletirebillir. Kaltmn olmas ya da olmamasnn
arayz gerekletirilmesi ile ilgisi yoktur.
Aadaki mekte Kisi snfnn alt snf olan Ogrenci snfnn Sekil
arayzn gerekletirii grlmektedir:
public class Ogrenci extends Kisi implements Sekil {
// dier kodlar
public void ciz() {
// buraya Ogrenci nesnelerini ekrana izen kod yazlacak
}
}
Kod 5-107. Ogrenci.java Kisi snfnn alt snf, Sekil arayzn gerekletirir
Bir snfn hangi snfn alt snf olduuna bal olmakszn herhangi bir
arayz gereletirebiliyor olmas, yukarda bahsettiimiz sorunlar
ortadan kaldrmaktadr. Bir ekil olmad ve Kisi adl bir snfn alt snf
olduu halde, SekilYoneticisi snf ile btnletirilebilmesi ve ekrana
nesnelerinin izilebilmesi iin Ogrenci snfnn yapmas gereken tek ey
Sekil arayzn gerekletirmektir.
Sekil arayzn gerekletiren snflar ciz() yntemini iereceklerine
gre, artk nesneleri ekrana izen SekilYoneticisi snf ciz()
arayzn gerekletiren btn snflarla alabilir.
public class SekilYoneticisi {
public static void main(String[] args) {
Sekil sekiller[];

// ......

// ekil nesnelerinin her birine ciz() iletisi gnder
for (int i = 0; i < sekiller.length; ++i) {
sekiller[i].ciz();
}

// ......
}
}
Kod 5-108. SekilYoneticisi.java
SekilYoneticisi snfnn koduna tekrar bakalm:
Sekil tipinden bir dizi ve dizinin herbir elemanna ynlendirilen ciz()
iletisini gryoruz. Kodu derleyici asndan deerlendirdiimizde, bu
kodun derleme hatas vermemesi iin Sekil trnn ciz() yntemini
iermesi gerektiini syleyebiliriz. Sekil tr ister snf ister arayz olarak
kodlanm olsun, ciz() yntemini ierdiine gre herhangi bir derleme
hatas sz konusu olmayacaktr.
alma zamannda ise sekiller[] dizisinin i indisli elemannn gsterdii
nesne hangi nesne ise, ciz() yntemi ge balama sayesinde o nesne
zerinden iletilecektir. Eer bu nesne ciz() ynteminin gerekletirimini
salamyorsa alma zamannda iletilecek yntem bulunamayacak ve bir
hata oluacaktr. Ancak sekiller[] dizisindeki btn nesneler Sekil
trnden olduuna gre, herbirisi ciz() ynteminin gerekletirimini
salayacaktr. nk Sekil arayz bir szlemedir ve ciz() ynteminin
gerekletiriminin bulunacan garanti etmektedir.
Arayzler ve Soyut Snflar
Bir arayzn iindeki btn yntemler gizliden (implicitly) public ve
abstract tanmldr. Bu adan bakldnda, btn yntemleri public ve
abstract olan bir soyut snfn arayz gibi grlecei sylenebilir. Derleme
kurallar ya da alma zamanndaki davran asndan da soyut snflar ile
arayzler birbirlerine ok benzerler.
rnein bir soyut snfn alt snf, ata snfndan ald soyut yntemlerin
gerekletirimlerini salayarak bu yntemleri geersiz klmazsa, alt snfn
da soyut tanmlanmas gerekir. nk geersiz klmad yntemler
nedeniyle soyut yntem ierecektir. Benzer ekilde, bir arayz
gerekletirdiini belirten bir snf, o arayzdeki btn yntemlerin
gerekletirimlerini iermezse soyut tanmlanmak zorundadr. nk
arayzdeki yntemler gizliden soyut yntemlerdir ve o arayz
gerekletiren snf soyut yntem ieriyor demektir.
Soyut snflar okbiimliliin gerekletirilmesinde nemli bir yere sahiptir.
Soyut snflar sayesinde, soyut tanmlanan yntemlerin alt snfta geersiz
klnmalar zorlanr. Benzer ekilde arayzler de ilerine tanmlanan
yntemlerin gerekletirimlerinin yaplmasn zorlarlar.
Bu tip kurallar, rahatlkla renilebilecek kurallardr ve herhangi bir
uygulama gelitirme arac yardm ile kolayca dzeltilebilecek derleme
hatalar ile farkedilebilirler. nemli olan, soyut snflar ile arayzler
arasndaki kavramsal farklarn renilmesidir.
ncelikle, soyut snfn btn yntemlerinin soyut olmas gerekmez. Soyut
snflar nitelikler ve/ya da soyut olmayan yntemler ierebilirler. Bu snflar
baz zel yntemlerin alt snflarda geersiz klnmalarn salamak zere
soyut tanmlanmlardr. Buna gzel bir rnek, soyut snflar ile ilgili
Magaza rneimizdeki Calisan snfdr. Calisan snfnn nitelikleri ve
soyut olmayan yntemleri olmasna ramen soyut tanmlanmasnn nedeni,
iki ynteminin alt snflarda o snflara zel bir ekilde gerekletirilmesinin
zorlanmasn salamaktr. Bu adan bakldnda, soyut snflar bir kaltm
sradzeninin parasdrlar ve btn alt snflar is a ilikisini salamaldr.
Arayzler ise nitelik ya da soyut olmayan yntemler ieremezler. Bir
arayzn iinde ancak sabitler ve/ya da yntemler bulunabilir. Sabitler,
gizliden public static final tanml, yntemler ise gizliden public
abstract tanmldrlar. Bu adan soyut snflardan farkllarlar.
Kaltm ilikisi asndan bakldnda, bir arayz gerekletiren snflarn
is a ilikisini salamalar gerektii sylenemez. Bir snf, bir arayz
gerekletirdiinde o arayzdeki btn yntem tanmlarn kaltmla
alm olur. Ancak bu daha ok btnletirme amac ile yaplr. rnein
Ogrenci snf Sekil arayzn gerekletirdiinde, aslnda mantksal
olarak is a illikisini salamamakta, bununla birlikte ciz() yntemini
alarak nesneleri izilebilir bir snf konumuna gelmektedir.
Arayzler genelde kaltm amacyla deil, arayz kavram anlatlrken
irdelenen, sistemler arasnda btnletirme noktalar oluturma amacyla
kullanlrlar. Eer gelitirilen bir sistemin baka sistemlerle
btnletirilebilmesi isteniyorsa, bu btnletirme tanmlanan arayzler
yardm ile gerekletirilir.
Arayzler ile oklu Kaltm (Multiple Inheritance)
Javada arayzlerin bir baka kullanm alan oklu kaltmdr. C++ gibi baz
diller bir snfn birden fazla snftan kaltmla zelletirilmesine olanak
verirken, Javada bir snfn extends anahtar szcnden sonra birden
fazla snfn ad yazlarak bu snflardan zelletirilmesi olanakl deildir.
Bununla birlikte, kaltm ou zaman nitelikler iin deil davranlar
(yntemler) iin yaplr. Bu gibi durumlarda zelleen veri deil davrantr
ve bu davranlar ata snfta soyut tanmlanr. te bu noktada eer soyut
yntemler iin kaltm yaplacaksa arayzler devreye girebilir. nk bir
snf, gerekletirdii arayzdeki btn yntemleri iermekte ve birden
fazla arayz gerekletirebilmektedir. Bylece, ad kaltm olmasa da
dolayl yoldan oklu kaltm gerekletirilebilir. Aada oklu kaltmn
arayzler ile nasl gerekletirildii grlmektedir.

ekil 5-15. oklu kaltm Kaltm aac
public interface MotorluTasit {
// motorlu tatlarla ilgili yntemler
}
Kod 5-109. oklu kaltm - MotorluTasit.java
public interface MotorsuzTasit {
// motorsuz tatlarla ilgili yntemler
}
Kod 5-110. oklu kaltm - MotorsuzTasit.java
public interface KaraTasiti {
// kara tatlaryla ilgili yntemler
}
Kod 5-111. oklu kaltm - KaraTasiti.java
public interface HavaTasiti {
// hava tatlaryla ilgili yntemler
}
Kod 5-112. oklu kaltm - HavaTasiti.java
public interface DenizTasiti {
// deniz tatlaryla ilgili yntemler
}
Kod 5-113. oklu kaltm - DenizTasiti.java
public class Otomobil implements MotorluTasit, KaraTasiti {
// MotorluTasit ve KaraTasiti arayzlerinden gelen yntemlerin
// gerekletirimleri
}
Kod 5-114. oklu kaltm - Otomobil.java
public class Bisiklet implements MotorsuzTasit, KaraTasiti {
// MotorsuzTasit ve KaraTasiti arayzlerinden gelen yntemlerin
// gerekletirimleri
}
Kod 5-115. oklu kaltm - Bisiklet.java
public class Ucak implements MotorluTasit, HavaTasiti {
// MotorluTasit ve HavaTasiti arayzlerinden gelen yntemlerin
// gerekletirimleri
}
Kod 5-116. oklu kaltm - Ucak.java
public class Kano implements MotorsuzTasit, DenizTasiti {
// MotorsuzTasit ve DenizTasiti arayzlerinden gelen yntemlerin
// gerekletirimleri
}
Kod 5-117. oklu kaltm - Kano.java
Bu rnekte de grld gibi, davran kaltmnda arayzler kullanlabilir
ve bir snf birden fazla arayz gerekletirebilmesi sayesinde oklu
kaltm salanabilir.
Benzer kaltm ilikileri soyut snflar ya da soyut olmayan snflar ve
arayzler bir arada kullanlarak farkl ekillerde oluturulabilir. Burada tek
doru yoktur. nemli olan, oluturulan modelin doru, tutarl ve
geniletilebilir olmasdr. Gerek arayzler, gerek soyut olan ya da olmayan
snflar bu gereksinimleri karlayacak ekilde dilendii gibi kullanlabilir.
Arayzler Arasndaki Kaltm likisi
Bir snf ile baka bir snf arasnda kaltm (extends) ilikisinin
kurulabileceini biliyoruz. Bir snf ile bir ya da daha fazla arayz arasnda
da gerekletirme (implements) ilikisinin kurulabileceini grdk.
Bir arayz ile baka bir arayz arasnda ise gene kaltm ilikisi kurulabilir.
Aynen snflar arasnda olduu gibi extends anahtar szc ile bir
arayzn baka bir arayz zelletirdii belirtilebilir. Bu durumda, ata
arayz zelletiren alt arayz, atasndaki yntemleri alr.
Aada iki arayz arasnda kaltm ilikisinin nasl kurulduu ve alt
arayz gerekletiren snf grlmektedir:
public interface AtaArayuz {
void islev1();
void islev2();
}
Kod 5-118. Arayzler arasnda kaltm AtaArayuz.java
public interface AltArayuz extends AtaArayuz {
void islev2();
void islev3();
}
Kod 5-119. Arayzler arasnda kaltm AltArayuz.java
public class OrnekSinif implements AltArayuz {
public void islev1() {
// islev1 gerekletirimi olan kodlar
}
public void islev2() {
// islev2 gerekletirimi olan kodlar
}
public void islev3() {
// islev3 gerekletirimi olan kodlar
}
}
Kod 5-120. Arayzler arasnda kaltm OrnekSinif.java



5.7 Aykr Durumlar (Exceptions)
Bir tasarm yaplrken, uygulamann almas srasnda ne olmamas
gerektiine deil, ne olmas gerektiine odaklanmak gerekir. nk
gelitirilen uygulamann kullanlmas srasnda genellikle kullanclarn
beklenen biimde davranacaklar, girdilerin beklendii ekilde olaca ve
herhangi bir ekilde sorun olumayaca varsaylr.
Uygulamalardan ncelikle gereksinimleri doru bir ekilde karlamalar
beklenir. nk bu gereksinimler, uygulamann kullanld srenin ok
byk bir kesimini oluturacaktr. Birok kullanc ou zaman ok tekdze
ve basit iler yaparlar ancak bu iler hemen hemen btn alma
vakitlerini alr. Byle bir kullanc iin nemli olan, uygulamann bir takm
zel durumlarda oluabilecek sorunlar karsnda nasl davrand deil, en
temel gereksinimleri ne kadar kolay ve doru karladdr.
Hangi teknoloji, dil ya da programlama yaklam ile gelitirildiinden
bamsz olarak, ou uygulamann kullanc profili bahsedildii gibidir.
Buna ek olarak, uygulamalarn baarsn belirleyen de gene bu tip
kullanclardr. nk bu kullanclar ou zaman uygulamay en youn
kullanan ve iyi ya da kt deerlendirmelerini en rahat dile getiren
kiilerdir.
Dolaysyla, bir uygulama tasarlanrken ncelikle uygulamann temel
gereksinimleri zerinde durulur. Uygulamann almas srasnda
oluabilecek bir takm zel durumlar (rnein bir dosyann bulunamamas
ya da balanlacak baka bir makinann o anda yant vermiyor olmas..
gibi) yerine, bu zel durumlarn olumad senaryolar irdelenir.
Uygulamann tasarmnda izlenen bu yol sayesinde, nadiren oluabilecek
zel durumlar yerine, her zaman kullanlacak temel gereksinimlere daha
fazla emek harcanm olur.
Benzer yaklam kodlama srasnda da kendisini gsterir. Eer ne olmas
gerektiinden ok ne olmamas gerektiine odaklanlrsa, ortaya kacak
kod birok denetim deyimiyle karmaklam, ynetilmesi ve
geniletilmesi zor bir kod haline gelecektir. Bu durumu yle bir senaryo
ile rnekleyelim:
rnek senaryo: Gelitireceimiz program dosyalarla alyor;
kullancnn girdii bir takm bilgiler dosyalara kaydediliyor, dosyalardaki
bilgiler kullanc tarafndan incelenebiliyor ya da gncellenebiliyor olsun.
Tipik bir ilem, belirli bir dosyadaki bilgileri okuma ilemi olacaktr. imdi
bu tipik ilemi, nce oluabilecek sorunlar ele alarak, sonra da hi sorun
olmayacakm gibi davranarak gerekletiren algoritmalara bakalm:
1- dosya adn al
2- bu isimde bir dosya varsa;
2-1- dosyay okuma amal olarak a
2-2- dosya alabildiyse;
2-2-1- veri oku
2-2-2- okumada sorun yoksa;
2-2-2-1- ilemi yap
2-2-2-2- dosyay kapat
2-2-2-3- dosya kapatlamadysa
2-2-2-3-1- kullancya sorunu bildir
2-2-2-4- k
2-2-3- okumada sorun varsa;
2-2-3-1- kullancya sorunu bildir
2-2-3-2- dosyay kapat
2-2-3-3- dosya kapatlamadysa
2-2-3-3-1- kullancya sorunu bildir
2-2-3-4- k
2-3- dosya alamadysa;
2-3-1- kullancya sorunu bildir
3- bu isimde bir dosya yoksa;
3-1- kullancya sorunu bildir
4- k
Kod 5-121. Dosyadan veri okuma, olas sorunlar ele alnrsa
Bu algoritmada olas sorunlu durumlar ele alnmtr. Bu olas sorunlu
durumlarn ele alnmasyla birlikte ortaya kan sakncal durumlar ise u
ekilde zetlenebilir:
1- Grld gibi esas yaplmak istenen i bir dosyadan veri okumaktr.
Ancak bu i ile ilgili kod kesimleri, olas sorunlu durumlar ele alan kod
kesimlerinin arasnda kaybolmu durumdadr. Gerek ii yapan kod kesimi
az olsa da o kod kesiminin bal olduu koullar ieren kod kesimleri
olduka kalabalktr. Dolaysya kodun bakm zorlamaktadr.
2- Kullanclar bu program altrrlarken dosyann bulunamamas,
alamamas ya da dosyadan veri okunamamas olaslklar olduka
dktr. 100 altrmadan belki 99, belki 100 defasnda sorun
kmayacak olmasna ramen, kodlamaya harcanan emek olas sorunlu
durumlar iin daha fazladr. Oysa kullanclar ounlukla programn
sorunsuz yzn grecek ve deerlendireceklerdir.
3- Btn olas sorunlu durumlar ele almak olanakl olmayabilir. Unutulan
olas sorunlar da bulunabilir. Bu durumda harcanan emek de boa gitmi
olur.
1- dosya adn al
2- dosyay okuma amal olarak a
3- veri oku
4- ilemi yap
5- dosyay kapat
6- k
Kod 5-122. Dosyadan veri okuma, olas sorunlar ele alnmazsa
Bu algoritma ise hi sorun kmayacakmcasna ilem yapmaktadr. Bir
nceki algoritma ile karlatrldnda kodun ok daha temiz, kolay
anlalr ve ynetilebilir olduu grlmektedir. Ayrca, olumas
beklenmeyen durumlar iin emek de harcanmamtr. Ancak kk
olaslkla da olsa, eer olas sorunlu durumlardan birisi gerekleirse ne
yaplaca belirlenmemi olduundan, kullanc kt srprizlerle
karlaabilir ve bu da uygulamann ve dolaysyla uygulama gelitiricisinin
gvenilirliini zedeleyecektir.
Grld gibi her iki algoritmann da baz sakncalar bulunmaktadr. te
bu noktada Aykr Durumlardan bahsetmek gerekir.
Aykr durum, kodun almas srasnda karlalmas beklenmeyen
(aykr) bir durum olutuu taktirde, kodu ileten kesimin (Java Sanal
Makinas) devreye girerek programn akn kestii ve gerekleen aykr
durumu belirten bir nesne oluturarak programa verdii bir dzenektir.
Nesnenin oluturulup programa verilmesine aykr durum frlatma
(throwing exception) ad verilmektedir.
Aykr durumlar sayesinde, yukarda bahsettiimiz iki farkl algoritma ile
ortaya kan sakncal durumlardan kurtulmak olanakldr. Aykr durum
dzenei kullanlarak, yaplacak iin doas gerei karlalmas
beklenmeyen, o senaryo iin gerekten de aykr olan durumlarn bir takm
denetim deyimleri ile ele alnarak kodun karmaklatrlmas
engellenebilecei gibi, ele alnmam bir sorunun olumas sonucunda
programn kontrolsz bir ekilde aklmas olasl da ortadan kaldrlabilir.
Bylece hem daha kolay ynetilebilir bir kod ortaya km, hem de
kullancnn karsna, programn akldn gsteren anlamsz hata
ekranlar kmadan eitli nlemler alnm olur.
eitli dillerde aykr durum dzenekleri bulunmaktadr ve bunlar genelde
ayn mantkla almaktadr. Bu blmde Javann aykr durum dzenei
incelenecektir.
5.7.1 try catch blou
Aykr durum nesnesinin oluturulup programa verilmesine aykr durumun
frlatlmas demitik. Nesneyi oluturan ve frlatan kesim Java Sanal
Makinesidir (kendi aykr durum nesnelerimizi de frlatabiliriz, ancak bu
konu daha sonra aklanacaktr). Bu nesne, beklenmeyen bir durumun
olutuunu belirtir ve o durum ile ilgili eitli bilgiler ierir. Nesneyi
oluturmak iin kullanlacak olan snflar da Java Platformunun bir paras
olan Java APIde tanmlanmtr.
Frlatlan bir aykr durumun ele alnabilmesi iin aykr durumun
oluabilecei kod kesimi zel deyimler arasna yazlr. Bu deyimler try ve
catch deyimleridir. try ve catch deyimleri arasnda kalan kod kesimine
de try - catch blou ad verilir.
try catch blounun yazl aadaki gibidir:
deyim1;
try {
deyim2;
deyim3;
}
catch (Exception1 e) {
deyim4;
}
catch (Exception2 e) {
deyim5;
}
deyim6;
Kod 5-123. try catch blounun yazl
try deyimini takip eden { ile try blou balar. Bu kesime yazlan kodlar
programlama dili asndan doru olan her trl kodu ierebilir. Bu kesim }
ile kapatlr.
} iaretinin hemen arkasndan bir catch deyimi gelmelidir. En az bir tane
catch yazlmak zorundadr. Birden fazla catch deyimi de yazlabilir. catch
deyimi, try blounun iletilmesi srasnda herhangi bir aykr durum
frlatlrsa, frlatlan aykr duruma bal olarak iletilmesi istenen kodun
yazlaca yerdir. try blounda farkl aykr durumlarn oluma olasl
varsa, hangi catch blounun iletileceine catch deyimine yazlan snf
bilgisine baklarak karar verilir.
catch deyimine ait olan ( ) iaretleri arasna, bir aykr durum snfna ait
bir referans deiken tanm yaplmaktadr. Eer frlatlan aykr durum bu
catch deyimi tarafndan yakalanrsa, referans deiken yakalanan aykr
durum nesnesinin referans olacaktr. Bylece aykr durum nesnesi ile ilgili
bilgilere eriilebilecektir.
imdi Kod 7-108e dayanarak reteceimiz farkl senaryolarla try
catch blounun nasl iletildiine bakalm:
1. senaryo - Aykr durum frlatlmyor: try blou iletilirken herhangi bir
aykr durum frlatlmazsa, catch deyimlerine baklmaz ve en son catch
deyiminin bittii yerden kod iletilmeye devam eder. Eer herhangi bir
aykr durum olumazsa iletilecek deyimler aadaki gibi olacaktr.
deyim1
deyim2
deyim3
deyim6
kt 5-14. Aykr durum frlatlmad
2. senaryo deyim2 iletilirken Exception1 trnden aykr durum
frlatlyor: try blou iletilirken herhangi bir aykr durum frlatlrsa,
catch bloklarndan ilkine saplr. Eer catch deyimine yazlan snf ad,
aykr durum nesnesinin ait olduu snf ile ayn trden ya da onun ata
snf ise, bu catch blounun iindeki kodlar iletilir. Eer aykr durum
nesnesi ile catch deyimindeki snf ad arasnda byle bir iliki yoksa, takip
eden catch deyimine saplarak ayn ilem tekrarlanr. catch bloklarndan
yalnzca bir tanesi iletilir. Herhangi bir catch blounun iindeki kodlar
iletilmise sonraki catch deyimlerine baklmaz ve en son catch deyiminin
bittii yerden kod iletilmeye devam eder.
Bir catch blou iletildikten sonra, ak catch bloklarnn sonuncusunun
bitiinden devam eder. Aykr durum yakalandktan sonra aykr durumun
frlatld satra geri dnlmez!
deyim2 iletilirken Exception1 snfna ait bir aykr durum frlatlrsa,
iletilecek deyimler aadaki gibi olacaktr.
deyim1
deyim4
deyim6
kt 5-15. deyim2 iletilirken Exception1 aykr durumu frlatld
3. senaryo deyim2 iletilirken Exception2 trnden aykr durum
frlatlyor: Bir nceki senaryoda verdiimiz bilgilere dayanarak, deyim2
iletilirken Exception2 trnden bir aykr durum frlatlmas durumunda
iletilecek deyimlerin aadaki gibi olacaklarn syleyebiliriz:
deyim1
deyim5
deyim6
kt 5-16. deyim2 iletilirken Exception2 aykr durumu frlatld
4. senaryo deyim2 iletilirken Exception2 snfnn alt snf olan
Exception2Alt trnden aykr durum frlatlyor: 2. senaryoda
belirttiimiz gibi, bir catch deyimi ile aykr durumun yakalanabilmesi iin
o aykr durum nesnesinin ait olduu snfn catch deyimindeki snf ile
ayn ya da onun alt snf olmas gerekir. Bu senaryoda, frlatlan aykr
durum Exception2 snfnn bir alt snf olan Exception2Alt snfna ait
olduuna gre iletilecek deyimler aadaki gibi olacaktr:
deyim1
deyim5
deyim6
kt 5-17. deyim2 iletilirken Exception2Alt aykr durumu frlatld
catch deyimine yazlan bir snf, kendi snfndan ve alt snflarndan olan
btn aykr durum nesnelerini yakalayabilir. catch deyimlerinden yalnzca
bir tanesi iletilebildiine gre, bir catch deyiminin altna o catch
deyiminde belirtilen snfn alt snflarndan herhangi birisi ile baka bir
catch deyimi yazmak anlamsz olacaktr. Zaten derleyici de bu durumda
derleme hatas verir.
5. senaryo deyim2 iletilirken Exception3 trnden aykr durum
frlatlyor: catch bloklarndan hibirisinde Exception3 trne ait bir
bildirimde bulunulmad ve Exception1 ya da Exception2 snflar
Exception3 snfnn ata snf olmad iin bu kod rneinde aykr durum
yakalanamaz. Bir aykr durum frlatlm ve catch deyimlerinden
hibirisinde o aykr durum yakalanamamsa ne olur? Kodun ak nasl
devam eder?
Eer henz yakalanmam bir aykr durum varsa, o aykr durum
yakalanana kadar hibir kod iletilmez (finally blou bu genellemenin
dndadr, ilerleyen kesimde anlatlacaktr). Aykr durumun frlatld kod
kesimi bir try catch blounun iindeyse, o catch bloklarnda uygun
(catch deyimindeki snfn aykr durum ile ayn snftan ya da onun ata
snf olduu) bir catch deyimi aranr. Bulunamazsa, bir st kod blouna
klarak, o kod blouna ait bir catch deyimi aranr. rnein eer bir
yntem iletilirken aykr durum olumusa, bu yntemin arld kod
kesiminin iinde bulunduu try catch blouna ait olan catch
deyimlerine baklr. Bu ak, aykr durum yakalanana kadar devam eder.
Eer aykr durum herhangi bir catch blounda yakalanrsa, o catch
bloundan sonraki catch bloklarnn en sonuncusunun bittii yerden kod
iletilmeye devam eder. Aykr durum yakalanamazsa, bir st kod blouna
klar programn balad main ilevine kadar srer. Burada da aykr
durumu yakalayacak deyimler bulunamazsa, programn almas sona
erer. Aykr durum, program altran Java Sanal Makinesi tarafndan
yakalanr ve konsola aykr durum ile ilgili bir takm bilgiler (aykr
durumun ne olduu, aklamas, hangi satrda olutuu ve o satra
gelinene kadar hangi ilevlerden geildii) yazlr.
6. senaryo deyim2 iletilirken Exception1 trnden aykr durum
oluuyor. Sonra deyim4 iletilirken Exception2 trnden bir aykr durum
oluuyor: Bu senaryoda oluan aykr durum ilk catch deyimi ile
yakalanm ancak catch blou iletilirken yeni bir aykr durum olumutur.
lk bakta, oluan aykr durum Exception2 snfna ait olduuna gre
hemen bir sonraki catch deyimi ile yakalanr ve deyim5 iletilir diye
dnlebilir. Ancak daha nce verdiimiz bilgilere gre, ayn try blouna
ait catch bloklarndan yalnzca bir tanesi iletilebilir. Bu durumda, deyim4
iletilirken oluacak aykr durum, bir sonraki catch deyimi tarafndan
yakalanamaz. 5. senaryoda akladmz gibi, bu aykr durumun
yakalanabilmesi iin bir st kod blouna baklacaktr. Buradan itibaren ak
5. senaryodaki gibidir.
5.7.2 finally deyimi
Bir try catch blounun sonuna finally deyimi yazlabilir. finally
deyiminin yazlmas zorunlu deildir. Eer yazlacaksa, en son catch
blounu takip etmelidir.
finally blou, aykr durum olusun olumasn, yakalansn yakalanmasn
her durumda iletilmesi istenen kod kesimlerinin yazld yerdir. Bu
ifadeyi yine bir kod rnei ve yukardaki senaryolar ile aklamaya
alalm.
deyim1;
try {
deyim2;
deyim3;
}
catch (Exception1 e) {
deyim4;
}
catch (Exception2 e) {
deyim5;
}
finally {
deyim6;
}
deyim7;
Kod 5-124. try catch finally yazl
1. senaryo - Aykr durum frlatlmyor: try blou iletilirken herhangi bir
aykr durum frlatlmazsa, catch deyimlerine baklmaz. finally blou
iletilir ve finally blounun bittii yerden kod iletilmeye devam eder:
deyim1
deyim2
deyim3
deyim6
deyim7
kt 5-18. Aykr durum frlatlmad
2. senaryo deyim2 iletilirken Exception1 trnden aykr durum
frlatlyor: Aykr durum ilk catch deyimi ile yakalandktan sonra finally
blou iletilir ve finally blounun bittii yerden kod iletilmeye devam
eder:
deyim1
deyim5
deyim6
deyim7
kt 5-19. deyim2 iletilirken Exception1 aykr durumu frlatld
3. senaryo deyim2 iletilirken Exception2 trnden aykr durum
frlatlyor: Aykr durum ikinci catch deyimi ile yakalandktan sonra
finally blou iletilir ve finally blounun bittii yerden kod iletilmeye
devam eder:
deyim1
deyim4
deyim6
deyim7
kt 5-20. deyim2 iletilirken Exception2 aykr durumu frlatld
4. senaryo deyim2 iletilirken Exception2 snfnn alt snf olan
Exception2Alt trnden aykr durum frlatlyor: Aykr durum ikinci
catch deyimi ile yakalandktan sonra finally blou iletilir ve finally
blounun bittii yerden kod iletilmeye devam eder:
deyim1
deyim4
deyim6
deyim7
kt 5-21. deyim2 iletilirken Exception2Alt aykr durumu frlatld
5. senaryo deyim2 iletilirken Exception3 trnden aykr durum
frlatlyor: catch bloklarndan hibirisinde Exception3 trne ait bir
bildirim bulunmadna gre bu aykr durum yakalanamaz. finally blou
iletilir ve bir st kod blouna saplr:
deyim1
deyim6
kt 5-22. deyim2 iletilirken Exception3 aykr durumu frlatld
6. senaryo deyim2 iletilirken Exception1 trnden aykr durum
oluuyor. Sonra deyim4 iletilirken Exception2 trnden bir aykr durum
oluuyor: Bu senaryoda oluan aykr durum ilk catch deyimi ile
yakalanm ancak catch blou iletilirken yeni bir aykr durum olumutur.
finally blou iletildikten sonra kodun ak bir st kod blouna
sapacaktr.
5.7.3 Javada Aykr Durumlar
Aykr durum dzeneinin almasn rneklerle pekitirmeden nce Java
API ile gelen aykr durum sradzenini incelemekte fayda var.
Aadaki ekil Javadaki aykr durum sradzenini (hierarchy)
zetlemektedir. Burada, var olan aykr durumlarn ok kk bir alt
kmesi grlmektedir. Ama btn aykr durumlar tantmak ya da
anlatmak deil, birazdan aklayacamz aykr durum snflandrmasnn
nereden geldiini gstermektir. Aykr durumlarla ilgili daha geni bilgi
almak iin Java API Belirtimi belgelerini incelemek gerekir.

ekil 5-16. Javada aykr durum sradzeni
Throwable snf btn aykr durumlarn atasdr. Bir aykr durum
nesnesinin frlatlabilmesi iin, o nesnenin ait olduu snfn Throwable
snfnn dorudan ya da dolayl alt snf olmas gerekir. Throwable
snfnn iki tane dorudan alt snf bulunmaktadr: Exception ve Error
snflar.
Error snf ve onun alt snflar, bir uygulamann ele almas beklenmeyen,
anormal koullar sonucunda olumu hatalar belirtirler. Bunlar normal
koullarda meydana gelmemesi gereken durumlardr.
Exception snf ve onun alt snflar ise uygulamann kodunda try
catch bloklar ile ele alnabilecek aykr durumlarn oluturulduu snflardr.
Denetlenen Aykr Durumlar (Checked Exceptions)
ekil 7-15te grlen aykr durum sradzeninde, sol tarafta bulunan ve
Exception snf ile balayan kaltm aacnda RuntimeException snf ile
balayan alt aacn dnda kalan btn aykr durumlar denetlenen aykr
durumlardr. rnein ekil 7-15teki Exception, IOException ve
SQLException snflar denetlenen aykr durum snflardr.
Soru: denetlenen aykr durum ne demektir? Denetleme iini kim
yapmaktadr?
Eer iletilecek bir kod kesiminde, denetlenen aykr durum olarak
adlandrlan snflardan herhangi birisine ait bir aykr durum olumas
olasl varsa, programcnn bu aykr durum oluma olaslnn farknda
olduunu derleyiciye bildirmesi gerekir. Baka bir deyile denetlenen
aykr durumlar, ele alnp alnmadklar derleyici tarafndan
denetlenen aykr durumlardr. Eer bu aykr durumlar ele alnmam
ise derleme hatas oluur.
Programcnn bu bildirimi yapabilmesinin iki yolu bulunmaktadr.
Bunlardan ilki, denetlenen aykr durumun frlatlma olasl bulunan kod
kesimini bir try catch blouna yazmak ve catch deyimlerinden bir
tanesinde bu aykr durumu ele alabilecek bildirimin yaplmasdr.
kinci yol ise throws deyimini kullanmaktr. Eer bir kod kesiminde
denetlenen bir aykr durum frlatlma olasl varsa ve programc try
catch blounu yazmak ya da yazd try catch blounda bu aykr
durumu ele almak istemiyorsa, kod kesiminin iinde bulunduu yntemin
bildiriminin sonuna throws deyimi yazlr.
rnein aadaki kod rneinde deyim1 iletilirken Exception1 adl bir
denetlenen aykr durumun frlatlmas olasl, yntem bildiriminin
sonundaki throws deyimi ile belirtilmitir.
public void islev() throws Exception1 {
....
deyim1;
....
}
Kod 5-125. throws deyimi ile bir aykr durumun frlatlabileceinin belirtilmesi
Soru: Oluabilecek bir aykr durum niin try catch blou ile ele
alnmaz da throws deyimi ile yntemin o aykr durumu frlatabilecei
belirtilir?
Bir yntem, ald parametreler ile alan bir kod kesimidir. Yntemin
iindeki kod kesimi, programn geri kalan ksmlarnda neler olup bittii ile
ilgilenmez/ilgilenmemelidir. Bir yntemin (genel olarak her ilevin)
yalnzca kendisine verilen parametrelere dayanarak tanml bir ii (yalnzca
1 ii) yapmas, kodun modlerliini, deitirilebilirliini arttran ve bakmn
kolaylatran bir programlama tekniidir. Baz durumlarda, yntem
alrken bir aykr durum oluursa ne yaplmas gerektii o yntemi
aran kod kesiminde karar verilebilecek bir konudur. Dolaysyla,
yntemden tek beklenen, yapmak zere arld tanml ii baaryla
gerekletirmesi, eer gerekletiremiyorsa sorunun ne olduunu
arld yere bildirmesidir.
Denetlenen aykr durumlar, derleyici tarafndan ele alnmalar zorlanan
aykr durumlardr. Eer yntemin iin denetlenen aykr durum
snflarndan herhangi birisine ait bir aykr durumun frlatlmas olasl
varsa, bu aykr durumun ele alnmas gerekecektir. Ancak az nce
akladmz nedenlerle bu aykr durumun try catch ile ele alnmas
doru olmayabilir. te bu durumda throws deyimi devreye girer.
Denetlenmeyen Aykr Durumlar (Unchecked Exceptions)
Denetlenen aykr durum snflarnn dnda kalan ve Exception snfnn
alt snf olan btn snflar (yani RuntimeException snf ve onun
dorudan ya da dolayl btn alt snflar) denetlenmeyen aykr
durumlardr. Denetlenmeyen aykr durumlar, ele alnmalar derleyici
tarafndan zorlanmayan aykr durumlardr ve bu tip aykr durumlarn ele
alnp alnmamalar programcnn kararna baldr. try catch blou ile
yakalanmalarnda herhangi bir saknca yoktur. rnein
NullPointerException denetlenmeyen bir aykr durumdur ve deeri
null olan (herhangi bir nesneyi gstermeyen, nesne adresi tutmayan) bir
referans deiken kullanlarak bir yntem ya da nitelie eriilmeye
allrsa oluur.
5.7.4 Programcnn Kodlad Aykr Durumlar
Programclar isterlerse kendi aykr durum snflarn da tanmlayabilirler.
Bir aykr durum snf tanmlamak iin Throwable snfnn dorudan ya da
dolayl olarak alt snf olan bir snf kodlamaktr. Ancak genelde Throwable
snfnn dorudan alt snfn yazmak yerine, onun alt snf olan Exception
snfnn dorudan ya da dolayl alt snfn yazmak tercih edilir.
Programc, yazd aykr durumun denetlenmeyen aykr durum olmasn
isterse RuntimeException snf ile balayan sradzen aacnn altnda
kalacak bir snf yazar. Bu aacn dnda kalan bir aykr durum ise
denetlenen aykr durum olacaktr.
Aykr durum snflarnn isimleri genelde Exception szc ile
sonlandrlr. Bylece o snfn bir aykr durum snf olduu snf ad ile
belirtilmi olur:
AcikOturumYokException.java, BaglantiSaglanamadiException.java
Aada biri denetlenen biri de denetlenmeyen aykr durum olmak zere
iki adet aykr durum snf grlmektedir.
public class AcikOturumYokException extends Exception {
public AcikOturumYokException() {
super();
}
public AcikOturumYokException(String msg) {
super(msg);
}
public AcikOturumYokException(Exception e) {
super(e);
}
}
Kod 5-126. AcikOturumYokException.java
public class BaglantiSaglanamadiException extends RuntimeException {
public BaglantiSaglanamadiException() {
super();
}
public BaglantiSaglanamadiException(String msg) {
super(msg);
}
public BaglantiSaglanamadiException(Exception e) {
super(e);
}
}
Kod 5-127. BaglantiSaglanamadiException.java
Programc tarafndan yazlan aykr durumlar, baz koullarn olumasna
bal olarak gene programc tarafndan frlatlmak zorundadr. rnein
yukardaki aykr durumlardan AcikOturumYokException, uygulamay
kullanmak isteyen bir kullancnn nce kullanc ad ve parola girerek
sistemde bir oturum amad durumda frlatlabilir. Kullancnn henz
oturum ap amadn denetleyen kod kesimi, eer oturum almamsa
bu aykr durumu frlatabilir.
ster programc tarafndan yazlm bir aykr durum snf olsun, ister Java
API ile gelen bir aykr durum snf olsun, bir aykr durumun
frlatlabilmesi iin throw deyimi kullanlr. throw deyimi, kendisinden
sonra gelen aykr durum nesnesini frlatr. Aada nasl kullanld
grlmektedir:
public static A islev(HttpSession session)
throws AcikOturumYokException {

if (session.getAttribute("oturumBilgileri") == null) {
throw new AcikOturumYokException();
}
return new A();
}
Kod 5-128. throw deyiminin kullanlmas
Buradaki rnekte bir if deyimi ile bir koul denetlenmekte, koulun doru
olmas durumunda AcikOturumYokException snfna ait bir aykr durum
frlatlmaktadr. AcikOturumYokException aykr durumu RuntimeException
snfnn alt snf olmadndan, denetlenen aykr durumdur. O nedenle
yntemin tanmnda throws deyimi ile bildirilmitir.
throws deyimi ile throw deyimini birbirine kartrmamak gerekir. throws
deyimi bir yntemin iinde frlatlabilecek bir aykr durumu yntemi aran
kod kesimine bildirmekte, throw deyimi ise bir aykr durum nesnesini
frlatmaktadr.
Programc Neden Kendi Aykr Durum Snflarn Yazar?
Java Platformu zengin bir aykr durum ailesi sunmaktadr. Bir uygulama
gelitirilirken yeni aykr durum snflarnn tanmlanmas yerine, var olan
aykr durum snflarnn kullanlmas uygulanabilir bir yntemdir. Ancak
baz durumlarda programclar kendi aykr durum snflarn yazma gerei
duyarlar.
Uygulama gelitirme atlarn (framework) kodlayan kii ya da gruplar,
gelitirdikleri at ile ilgili aykr durum snflarn tanmlarlar. Bu balamda
Java API de bir uygulama gelitirme ats olarak grlebilir ve Java API ile
gelen aykr durumlar aslnda bu bak as ile deerlendirilmelidir. Java
dnyasnda bir ok uygulama gelitirme ats bulunmaktadr. Bunlar Web
tabanl uygulama, veri taban uygulamas ya da datlm uygulamalar
gelitirmek gibi amalar iin oluturulmu atlar olabilir (Struts, Spring,
Hibernate, EJB...). Her uygulama ats kendi aykr durum ailesi ile birlikte
gelmektedir.
Programclarn kendi aykr durumlarn yazmak istemelerinin bir baka
nedeni de kodun okunurluunu arttrmak ve ynetim kolayl getirmektir.
nk bir aykr durum snfna verilen isim, oluan zel durumu kolaylkla
ifade edebilir. Exception ad ile yakalanan bir aykr durum nesnesine
gre, AcikOturumYokException ad ile yakalanan bir aykr durum ok
daha aklaycdr ve kodun bakm asndan nemli olabilir. Dolaysyla
zaman zaman programclar kendi aykr durum snflarn tanmlama
yolunu semektedirler.
5.7.5 Aykr Durumlarn Ynetilmesi
Aykr durum dzeneinin renilmesi kolaydr. Denetlenen aykr
durumlar da zaten derleyici tarafndan tespit edileceklerdir. Dolaysyla
aykr durumlar kodlamakla ilgili ciddi bir zorluk yoktur.
Ancak esas nemli olan konu aykr durumlar yakalandnda ne
yaplacadr. Bu noktada aykr durum ynetme stratejileri devreye girer.
Uygulamann yapsna gre eitli farkl stratejiler belirlenebilir. Ancak bir
takm nemli noktalar aklda tutmakta fayda vardr.
1. Nokta: Yalnzca gerekten aykr olan (beklenmeyen) durumlar aykr
durum olarak kodlamak gerekir. Aykr durum nesnesinin oluturulmasnn
ilemci ve bellek asndan bir maliyeti vardr. Dolaysyla, olumas
beklenen durumlarn aykr durum olarak ele alnmalar yanl olabilir.
rnein bir blme ileminde blenin 0 (sfr) olmas olasl varsa, bu
durum DivisionByZeroException aykr durumu ile deil, basit bir if
deyimi ile denetlenmelidir. nk blenin sfr deerini almas zaten
bekleniyordur ve bu durumun if deyimi ile denetlenmesi daha az
maliyetlidir.
2. Nokta: Kendi aykr durum snflarmz oluturmadan nce Java API ile
gelen aykr durum sradzenini incelemek gerekir. Olduka zengin bir
aykr durum aac varken, bunlar kullanmayp kendi aykr durumlarmz
yazmaya karar verirken iki kere dnmekte fayda vardr.
3. Nokta: Her aykr durumun tek tek ele alnmas anlaml olmayabilir. Bir
try blou iletilirken frlatlma olasl olan aykr durumlarn herbirisi iin
ayr bir catch deyimi yazmak, yazlmas ve ynetilmesi gereken kod
miktarn arttracaktr. Eer gerekten de her aykr durumun ayr ayr ele
alnmas gerekmiyorsa ya da aykr durumun trne gre yaplacak ilem
deimiyorsa bu yaklam sakncal olabilir. nk yazlacak her satr kod
bakm yaplacak kod miktarn arttrmaktadr. Birden fazla aykr durum
ortak bir ata snf ile ele alnabilir.
4. Nokta: Btn aykr durumlarn tek bir ata snf ile ele alnmas anlaml
olmayabilir. Exception snf btn aykr durumlarn atas olduuna gre,
herhangi bir try blounun sonuna Exception snfn (ya da frlatlabilecek
aykr durumlarn ortak atas olan baka bir snf) kullanarak tek bir catch
deyimi yazmak ve bununla btn aykr durumlar yakalamak olanakldr.
Ancak bu yaklam da hangi aykr durumun olutuu bilgisinin gerekli
olduu durumlarda sakncal olabilir.
5. Nokta: Bir aykr durum yakalandnda yaplabilecek en kt ey
hibirey yapmamaktr. zellikle aykr durum konusunu yeni renen
kiiler, bazen srf derleyici zorlad iin try catch yazarak denetlenen
aykr durumlara verilen derleme hatalarndan kurtulma yolunu seerler.
Ancak genellikle aykr durum olutuunda yaplacak birey de bulunamaz
ve catch blou bo braklr. Bu yaklam, yaplabilecek en kt eydir.
nk bir aykr durumun olumas yolunda gitmeyen bireyler olduunu
ifade eder. Aykr durum yakalanarak hibirey yapmadan, herey
yolundaym gibi programn almaya devam etmesi kullanc iin aldatc
olabilir. Daha kts, sorunlu durumun farkedilememesi nedeniyle
uygulamann dzeltilmesi olanann da n tkanm olur. Bir aykr
durum yakalandnda yaplabilecek en basit ilem bu aykr durumun
olutuu bilgisini bir yerlere kaydetmektir (rnein gnlk dosyalarna).
Bir aykr durum ile ilgili en temel ve aklayc bilgilerin alnmas iin
kullanlabilecek iki yntem bulunmaktadr: getMessage() ve
printStackTrace() yntemleri.
Aykr durumlar oluturulurken, oluan aykr durumu aklayan zet bilgi
bir ileti olarak aykr durum nesnesinin iine koyulur. getMessage()
yntemi, aykr durum nesnesinin iindeki bu iletiyi dndrr. Oluan
aykr durum ile ilgili temel bilgi verilmek istenirse bu ileti kullanlabilir.
Her yntem ars, arlan ynteme ait baz bilgilerin (yntemin yerel
deikenleri, parametreleri, dn deerleri ve adresleri) yt bellee
yazlmasna neden olur. Yttaki herhangi bir yntem, hemen altndaki
yntem tarafndan arlmtr. printStackTrace() yntemi, arld
anda ytta neler olduunu ekrana dken yntemdir. Bylece frlatlan
aykr durumun hangi satrda, hangi ilevde olutuu ve o ilevin
arlmasna kadar hangi ilevlerin arka arkaya arld grlm olur.
Frlatlan bir aykr durumun program iinde yakalan(a)mamas durumunda
bu aykr durumun Java Sanal Makinesi tarafndan yakalandn ve ekrana
baz bilgilerin yazldn daha nce belirtmitik. te bu bilgiler aslnda
Java Sanal Makinas tarafndan printStackTrace() yntemi arlarak
ytn durumunun ekrana yazdrlmasndan baka birey deildir.
Bu yntemler aykr durum nesnesini gsteren referans deiken
kullanlarak arlabilir. Aada yntemlerin kullanln rnekleyen kod
grlmektedir.
try {
deyim;
}
catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
Kod 5-129. getMessage() ve printStackTrace() yntemlerinin kullanl
Grld gibi her iki ynteme de, yakalanan aykr durum nesnesini
gsteren deiken olan e referans zerinden ulalmaktadr.
6. Nokta: Bir aykr durum yakalandnda ne yaplabileceinin iyi
deerlendirilmesi gerekir. Aykr durum dzenei programcya nlem alma
ve/ya da sorunun stesinden gelme olana verir. Aykr durumun
frlatlmasna neden olan koullarn deitirilmesi ve baka bir senaryonun
devreye sokulmas olanakl olabilir. Ancak baz aykr durumlar, alma
zamannda stesinden gelinemeyecek fiziksel sorunlardan kaynaklanr.
rnein okunmas gereken bir dosyann bozulmu olmas (IOException)
ya da balanlacak baka bir bilgisayara eitli nedenlerden
balanlamamas (SocketException) gibi durumlar alma zamannda
dzeltilebilecek sorunlar deildir. Genelde bu gibi koullar olutuunda
alnabilecek bir nlem ya da devreye sokulacak ikinci bir senaryo
bulunmaz. Bununla birlikte bu gibi aykr durumlarn ou denetlenen
aykr durumlar olarak tanmlanmtr. Yani ya try catch blou ile ya
da throws deyimi ile ele alnmalar gerekmektedir.
throws deyiminin kullanlma amac, denetlenen aykr durumlarla ilgili
derleme hatalarndan kurtulmak deil, yntemin aykr durumla
karlatnda ne yapacan bilmediini belirtmektir. Bylece o yntemi
aran kesimde aykr durumun ele alnmas beklenir. Eer throws deyimi
srf denetlenen aykr durumla ilgili derleme hatas almamak iin
kullanlrsa, birbirini aran yntem tanmlarnda zincirleme bir ekilde
throws deyimi yazmak gerekir ve programn almaya balad main
yntemine kadar yansyacaktr. Kodun her yerine throws deyimi yazmak
programlama asndan can skc bir durumdur ve kodu kirletmektedir.
Bunun yerine bir noktada try catch blou ile aykr durumun ele
alnmas gerekir.
Ksaca sylersek, denetlenen aykr durumlar genellikle try catch
blounun yazlmasn ve aykr durumun yakalanmasn zorlar. Ancak
yukarda da bahsettiimiz gibi baz aykr durumlarn alma zamannda
zlmeleri olanakl deildir. Bunlar ya kodda deiiklik yapmay ya da
bilgisayar ap kapatmak, a kablosunu takmak, yeni bir dosya
kopyalamak gibi fiziksel mdahaleleri gerektirir.
Soru: Baz denetlenen aykr durumlar try catch blou ile yakalamak
zorunda kalyoruz ancak alma zamannda bu aykr durumlarn
stesinden gelme ansmz yok. Ne yapmalyz?
Bir aykr durum yakalandnda yaplabilecek en kt eyin hibirey
yapmamak olduunu, en azndan bu aykr durum ile ilgili bilgilerin bir
gnlk dosyasna ya da konsola yazlmas gerektiini sylemitik. imdi
bir adm daha ileri giderek, eer alma zamannda stesinden
gelinemeyecek bir aykr durum ile karlalmsa programn denetimli bir
ekilde sonlandrlabileceini ifade edelim. Kullancnn karsna anlaml bir
ekran ya da ileti kartarak bir sorun olduunu, bu sorunun nasl
zlebileceini anlattktan sonra programn sonlandrlmas anlamldr.
Bylece kullanc o sorun ile ilgili nlem aldktan sonra program yeniden
altrabilir.
Bunu yapabilmenin en kestirme yolu, denetlenen aykr durumun
yakaland noktada bu aykr durum gnlk dosyasna yazldktan hemen
sonra yeni bir aykr durum frlatmak ve bu aykr durumu dier benzer
aykr durumlar da yakalayacak ve kullancnn karsna anlaml bir uyar
ekran kartacak daha stlerdeki bir kod blounda ele almaktr. Tabi ki
yeniden try catch ya da throws deyimleri ile uramamak iin,
frlatlan yeni aykr durumun denetlenmeyen bir aykr durum olmas
gerekir. Aada bununla ilgili kk bir kod rnei grlmektedir.
try {
deyim;
}
catch (SocketException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
Kod 5-130. Denetlenen aykr durumun yakalanarak denetlenmeyen aykr
durum frlatlmas
7. Nokta: Baz aykr durumlar programc hatas nedeniyle oluurlar. Bu
aykr durumlarn yakalanmayp uygulamann sonlanmas anlaml olabilir.
zellikle gelitirme srecinde, bu tip aykr durumlarn yakalanmamas
koddaki hatalarn belirlenmelerine ve dolaysyla dzeltilebilmelerine
olanak salayacaktr. rnein NullPointerException aykr durumu ou
zaman programc hatasnn sonucudur. Eer bir referans deikenin
deerinin null olmas olaan bir durumsa, bu koul basit bir if deyimi ile
denetlenerek ilem yaplr. Ancak bunun dnda NullPointerException
aykr durumu frlatlyorsa bu byk olaslkla programcnn hatasdr.
NullPointerException aykr durumu denetlenmeyen bir aykr durum
olduuna gre ele alnmas derleyici tarafndan zorlanmayacaktr.
Dolaysyla aykr durum yakalanmayacak ve uygulama sonlanacak, Java
Sanal Makinas aykr durumun hangi satrda frlatldn konsola
yazacaktr. Bylece hatann bulunup dzeltilmesi olanakl olur.
5.8 Girdi/kt (Input/Output I/O) lemleri
Java platformu, girdi/kt ilemleri ile ilgili olarak farkl paketler altnda
toplanm olan ok sayda snf ve arayz iermektedir. Farkl paketler,
girdi/kt ilemleri iin farkl soyutlama yaklamlar sunmaktadr.
java.io paketi, ak (stream) olarak adlandrlan yaplarn soyutlamalar
ile ilgili snf ve arayzleri iermektedir. Bunlar da kendi aralarnda byte-
tabanl ve karakter-tabanl olmak zere ayrlrlar.
java.nio paketi, daha hzl girdi/kt ilemleri gerekletirilebilmesi amac
ile tasarlanm, kanal (channel) ve yastk alan (buffer) olarak
adlandrlan soyutlamalar ve onlarla ilgili snf ve arayzleri ierir.
java.net paketi, a tabanl girdi/kt ilemleri iin soketler (sockets)
zerinde odaklanm, altta ak ya da kanal tabanl modeli kullanan
yaplar ierir.
Javada girdi/kt ilemlerinin bu kadar eitlilik gstermesi, hem
gereksinimlerdeki eitliliin hem de girdi/kt ktphanesinin
gelitirilmesi srecinin sonucudur. Dolaysyla bu blmde hem bu
gereksinim eitliliini hem de tarihsel srada Java girdi/kt
ktphanelerinin geliimini inceleyen bir bak as ile ilerleyeceiz. Bu
srada, zellikle programlamay yeni renen kiiler iin zaman zaman
kafa kartrc olabilen baz temel kavramlara deinmeyi de ihmal
etmeyeceiz.
Girdi/kt ilemleri denilince ilk akla gelen genelde Dosya
lemleri olmaktadr. Oysa A lemleri de girdi/kt
balamnda ele alnmaldr. Ancak bu kitapta hedeflediimiz
kitle ve belirlediimiz dzey bakmndan, bu kesimde
yalnzca Dosya lemlerini ele alacaz.


Text File Binary File
Writer - Stream
java.io.File
java.io.RandomAccessFile
io package
nio package
serialization transient - volatile
decorator pattern
5.9 Derlemler (Collections)
.

5.10 JavaBean Kavram
Java snflar ile ilgili olarak sarmalama ilkesi ve eriim yntemlerini
anlattktan hemen sonra, Java dnyasnda ok anlan ve nemli bir yeri
olan JavaBean kavramndan bahsetmemiz gerekir.
Kabaca bir tanm ile JavaBean, Javann yeniden kullanlabilen, aralar
yardm ile grsel olarak ynetilebilen yazlm bileeni olarak bilinir. Ancak
bu tanmn gerekten birey ifade edebilmesi iin bileen kavramn bir
para daha amalyz.
Bileen szc ok farkl balamlarda, bir btn oluturan paralardan
birine verilen ad anlamna gelecek ekilde kullanlmaktadr. Yazlm
dnyasnda ise birok farkl ge bileen olarak adlandrlmaktadr. rnein
levsel Programlamada (functional programming) her bir ilev programn
btnn oluturan bir bileen gibi grlebilirken, benzer ilevsellikleri
nedeniyle bir araya getirilmi kod kesimlerinin oluturduu modller de
bileen olarak adlandrlabilmektedir.
Son yllarda bileen (component) szc yazlm balamnda daha ak
bir anlam kazanm ve Bileen Tabanl Yazlm Mhendislii (Component-
Based Software Engineering) ya da Bileen Tabanl Yazlm Gelitirme
(Component-Based Software Development) yaklam erevesinde byk
nem kazanmtr. Bileen Tabanl Yazlm Gelitirme yeni bir yaklam
deildir ve yeni yazlmlarn oluturulmas iin daha nceden gelitirilmi
yazlm bileenlerinin bir araya getirilmesi fikrine dayanr. Ancak uzun
yllardr var olan bu yaklam, yeniden kullanlabilir yazlm bileenleri
pazarnn olumasyla birlikte yeniden nem kazanmtr.
Bileen Tabanl Yazlm Gelitirme, herhangi bir programcnn daha nce
gelitirdii kod paralarn (ilevleri, snflar) bir araya getirerek yeni bir
programda kullanmasndan ok; kaynak kod dzeyine inilmeden,
derlenmi kod kesimlerinin bir takm biimlendirme (configuration) aralar
yardm ile bir araya getirilerek yeni bir yazlm oluturulmas eklinde
gerekletirilir. Yazlmn gelitirilmesinde kullanlan bu derlenmi ve
davranlar biimlendirme aralar yardmyla deitirilebilen gelere
bileen ad verilir.
Bu yaklamda ama; yazlm oluturmak iin olabildiince hazr
bileenleri kullanarak yazlm gelitirme maliyetlerini drmektir. Hazr
bileenlerin satn alnmas, bu bileenler iin harcanacak olan gelitirme ve
bakm maliyetlerinden kurtulmak anlamna gelir. nk bu maliyet
bileeni satan kurulu tarafndan karlanacaktr. Bylece ..gelitirme!
Satn al!.. yaklam ile yazlm gereksinimleri hem daha hzl bir ekilde
karlanabilecek hem de kendi alanlarnda uzmanlam kurulularca
gelitirilmi bileenler kullanlacandan daha profesyonellemi rnler
ortaya kacaktr. Tabi btn bunlarn gerekleebilmesi iin ncelikle
bileen pazarnn gelimesi, yazlm gelitiricilerin gereksinim duyduklar
bileenlere ulaabilmeleri gerekmektedir.
Gnmzde zellikle Web uygulamalar ya da datlm uygulamalar
gelitirmek iin kullanlan teknolojiler ounlukla bu tanma uyan
(derlenmi ve davranlar biimlendirme aralaryla deitirilebilen)
bileenlere dayanmaktadr. Bu bileenler ounlukla Uygulama ats
(framework) ad ile karmza kmakta, baz uygulama atlar bir takm
gl gelitirme aralar ile desteklenirken (.NET iin Visual Studio ya da
eitli Java Uygulama atlar iin Eclipse eklentileri gibi), dierleri iin
ara destei daha snrl kalmaktadr. te yandan bunlarn bazlar cretli
iken birok cretsiz ve kaliteli rn de bulunmaktadr. Baka bir deyile
bileen pazar hzla bymektedir.
5.10.1 JavaBean Yazma Kurallar
JavaBean, Javann bileen modelidir. Bu adan bakldnda, her Java
snf bileen deildir. Bir Java snfnn JavaBean olabilmesi iin aadaki
kurallara uymas gerekir:
1- Snfn varsaylan kurucusu olmaldr
2- Snfn nitelikleri iin eriim yntemleri tanml olmal ve bu
yntemler daha nce anlatlan isimlendirme kurallarna uymaldr.
Bylece derlenmi durumdaki bir JavaBean nesnesinin ieriine
kodla ya da bir takm aralar yardm ile erimek olanakl olabilir.
3- Snf seriletirilebilir (serializable) olmaldr. Bylece nesnenin
durumu platformdan bamsz olarak yazlabilir, okunabilir ya da a
zerinden aktarlabilir.
Bir Java snfnn bu kurallara uymas, o snfn JavaBean olarak
adlandrlmas iin yeterli olsa da gerek anlamda bir JavaBean, niteliklerine
eriim olanandan daha fazlasn sunmaldr. Bir JavaBean, kendisi ile ilgili
olaylarn (events) dardaki kod kesimlerinden alglanabilmesi, durumunun
saklanabilmesi ya da davran ve grnnn dardan deitirilebilmesi
gibi amalara hizmet edecek kod kesimleri de ierecektir. Ancak bu kitabn
ierii ve hedef kitlesi asndan bu blmde bu konulara girilmeyecektir.
5.10.2 Seriletirme (Serialization)
lk iki kural imdiye kadar akladk. imdi seriletirmenin ne olduunu ve
nasl yaplacan aklayalm.
Seriletirme, bellekteki bir nesnenin btn alt nesne aacyla birlikte bir
byte serisi (byte sequence) haline getirilmesidir. Oluan veri bir dosyaya
yazlabilir ya da a zerinden baka bir makinadaki Java Sanal Makinasna
aktarlabilir. Dosyadan okunan ya da a zerinden alnan seriletirilmi
veri, bellekte yeniden Java nesnesine dntrlebilir (deserialization).
Yeni oluturulan nesne, orijinal nesnenin seriletirilmeden nceki halinin
aynsdr. Burada bir nemli nokta, seriletirilerek a zerinden tanan
Java nesnesinin farkl bir platformdaki bir Java Sanal Makinasnn
belleinde herhangi bir ek ileme gerek olmakszn yeniden nesne haline
getirilebiliyor olmasdr.
Peki bir nesnenin seriletirilebilir olmasnn faydas nedir? Bu noktada
seriletirmenin kullanmna dair iki rnek verelim.
lk rneimiz, seriletirme yardmyla etkin bellek kullanmdr. Bellekteki
her nesne kullanlabilir bellek alanndan birazn igal eder. Ancak herhangi
bir anda bellekte bulunan birok nesneye, aslnda o anda ve belki yakn
zaman diliminde eriilmeyecektir. Bu nesneler henz p Toplayc
(Garbage Collector) tarafndan da bellekten atlabilecek durumda olmayan,
yani kendilerine referans olduu iin henz p haline gelmemi
nesnelerdir. te bu noktada bellein daha etkin kullanlabilmesi iin
izlenen bir yol, alma zamannda belirli bir sre eriilmeyen baz
nesneleri seriletirip diske yazarak o nesnenin bellekte igal ettii yeri
boaltmaktr. Ayn nesneye sonradan tekrar eriildiinde, diskteki
seriletirilmi veri okunarak o nesne bellekte yeniden oluturulur ve
hizmet vermesi salanr. Bylece bellek daha etkin kullanlm olur. Bu
teknik, uygulama sunucular gibi baarmn ok nemli olduu byk ve
karmak sistemlerde uygulanmaktadr.
kinci rneimiz ise seriletirmenin bir baka kullanm alan olan Uzaktan
Yntem arma (Remote Method Invocation RMI) olacaktr. Uzaktan
Yntem arma, bir program oluturan nesnelerin eitli (baarm
ykseltmek, gvenlik, yedekleyerek alma.. gibi) nedenlerle farkl Java
Sanal Makinalar zerinde altrlmasna ramen, bu nesnelerin kullanc
tarafndan tek bir sanal makinada alyormu gibi grnmesini salar.
te bu noktada; farkl sanal makinalarda almakta olan nesnelerin
birbirlerinin yntemlerini arrken parametre gndermesi ya da
yntemden geriye deer dndrmesi sz konusu olduunda seriletirme
devreye girer. nk iki farkl makina arasnda aktarlacak olan veri
aslnda bir Java nesnesidir ve alma zamannda oluturulmutur. Bu
nesnenin bir A makinasndan B makinasna aktarlmas iin a
altyapsndan faydalanlacak olsa da, A makinasndaki nesnenin B
makinasnda yeniden oluturulabilmesi gereksinimi seriletirme yardm ile
karlanr. Gnderen taraf nesneyi seriletirir, a zerinden dier
makinaya aktarr, seriletirilmi nesneyi alan taraf bunu bellekte yeni bir
nesne oluturmak iin kullanr ve program bylece alp gider.
Seriletirmenin bu gibi kullanm alanlar, daha ok Kurumsal (Enterprise)
lekteki konularla ilgilenen Java Enterprise Edition (JEE) balamnda
kaldndan daha fazla ayrntya girmeyecek, hemen bu noktada bir snfn
seriletirilebilmesi iin ne yaplmas gerektiini aklayacaz.
5.10.3 java.io.Serializable Arayz
Bir Java snfnn seriletirilebilir olduu, java.io.Serializable
arayzn gerekletirmesi yoluyla bildirilir. Bu arayz bir iareti
arayzdr (marker ya da tagging interface). areti arayz, herhangi bir
yntem iermeyen arayz anlamna gelir. java.io.Serializable arayz
de herhangi bir yntem iermeyen, ancak derleyiciye bu arayz
gerekletiren snfn seriletirilebilir olup olmadn denetlemesini
syleyen bir arayzdr. Derleyicinin bir snfn seriletirilebilir olup
olmadn denetlerken kullanaca baz kurallar vardr:
1- Temel trler seriletirilebilirdir.
2- Seriletirilemeyen nitelikler iermeyen snflar seriletirilebilirdir.
3- Bir snf seriletirilemeyen bir nitelik ieriyorsa ve bu snfn yine de
seriletirilebilir olmas isteniyorsa, o nitelik transient anahtar
szc ile iaretlenerek, bu snfa ait bir nesne seriletirilirken bu
niteliin seriletirilmeyecei belirtilir.

You might also like