Jose M. Fernández Yazara yazi
|
Ozet: Makalelerin
bu serileri klasik programlama dillerini bir model olarak almistir.Java
dilinin ocelliklerine kisa bir giris yaptiktan sonra simdi veri cesitleri,
degiskenler, kontral ifadeleri gibi konularda calismaya baslayabiliriz.Bu
bize en onemli konu olan siniflara yol gostericek.Siniflar kavrami bu programlama
dilinin kokundedir.Baska bir deyisle siniflar bu programlam dilinin temelidir.Siniflar
konusunu ortaya koymak icin bu parca, programlama dilinin geri kalanina
benzerliginden oturu ESQUEMATICA¿? gibi olacak.
Java komutlari su uc stilin birinde olabilir.
Belirtecler degiskenlere, sinflara ve yontemlere dereleyicinin onlari tanimasi icin verilen isimlerdir.Herhangi bir harf katarini(yuksek ve dusuk durumda), numaralari ve alti cizgili ve dolar sembollerini kullanmak mumkundur.Onlar bir numarayla baslayamaz.
Java, ayiraclar gibi bazi ozel karakterleri kullanir.En cok kullanilan,bizim de bulabilecegimiz, ayiraclar:
Sembol | Tanimlama |
() | O tanimlamalardaki parametre listelerini bulundurur ve yontemleri arar.Ayrica ifade onceligini degistirmek ve ifadeleri bir kontrol cumlesinde ve cesit degisiminde icermek icin de kullanilir. |
{} | Baslangic vektorlerinin degerlerini otomatikmen icermek icin.Sinflarla, yontemlerle ve yerel isaretle kullanmak icin bir kod blogunu tanimlamak icin |
[] | |
; | Cumle ayiraclari. |
, | Degisken bildirilerindeki ardisik belirtecleri ayirmak icin.FOR cumlesinde cumleleri ayirmak icin. |
. | Paketi, alt paketi sinif isimlerini ayirmak icin.Referans yapilmis bir degiskenden yontemi veya bir degiskeni ayirmak icin. |
abstract | double | int | super |
boolean | else | interface | switch |
break | extends | long | synchronized |
byte | false | native | this |
byvalue | final | new | threadsafe |
case | finally | null | throw |
catch | float | package | transient |
char | for | private | true |
class | goto | protected | try |
const | if | public | void |
continue | implements | return | while |
default | import | short | |
do | instanceof | static |
Bir onceki makalede Java'nin tamamen nesne uygunlugu oldugundan bahsetmistim, yine de, goz onunde bulundurmaliyiz ki, Java nesne olmayan sekiz veri cesidini tanimlar.Bunun yaninda cesitli nedenlerden dolayi butun veri cesitleri tanimlanmis bir alana sahiptir.
Basit veri cesitleri dort gruba bolunebilir:
CESIT | ISIM | BOYUT | ALAN |
Integer | long | 64 | -9.223.372.036.854.775.808
a 9.223.372.036.854.775.807 |
int | 32 | -2.147.483.648
a 2.147.483.647 |
|
short | 16 | -32.768 a 37.767 | |
byte | 8 | -128 a 127 | |
Floating point | float | 32 | 3.4 e-038 a 3.4 e+038 |
double | 64 | 1.7 e-308 a 1.7 e+308 | |
Character | char | 16 | Unicode |
Boolean | boolean | true o false |
Genel olarak, bir degisken bu yolla bildirilir:
identifier type [=value] [,identifier [=value]......]; |
Ornekler:
int a = 4, b, c=7; char c; myclass class; |
Programlama dillerinin bir cogu iki isaret kategorisini tanimlar,kuresel ve yerel.Ama bu Java nesne uygunlugu modeline iyi uymaz.Bu modelde iki ana isaret, bir sinif ve bir yontem tarafindan tanimlanir.
(type) value |
int a; char b; a=(int) b; |
Bir floating point cesidinin bir integer cesidine degismesinde, parca
elemanini kaybedebilir:
int a; double d= 125.43; a=(int) d;degiken 125 degerine sahiptir. byte b; int i=257; b=(byte) i;b 1 degerine sahip, bu 257'nin 256'ya bolumunun sonucundaki 256 byte cesidinin alanidir. byte b; double d= 340.123; b=(byte) d;yukarida b 84 degerine sdahip olacak; |
islemci | Tanimlama |
+ | Addition |
- | Subtraction |
* | Multiplication |
/ | Division |
% | Modulo (division remaining) |
++ | Increment |
+= | Addition and assignment |
-= | Subtraction and assignment |
*= | Multiplication and assignment |
/= | Division and assignment |
%= | Modulo and assignment |
-- | Decrement |
int a=38; double d=41.95; int c=a%10;< double e=d%10; |
Gorevleriyle islemciler yapilarda yararlidir.Sunun gibi:
a = a + 4; esittir a+=4;
a = a % 2; esittir a%=2;
Normal olarak bu cumleleri soyle soyleyebiliriz:
var=var op expression; yerine var op= expression yazilabilir;
Islemci | Tanimlama |
~ | Unary NOT at bit level |
& | AND at bit level |
| | OR at bit level |
/\ | Exclusive OR exclusive at bit level |
>> | Right shift |
>>>> | Right shift filled with zeroes |
<< | Left shift |
&= | AND at bit level and assignation |
|= | OR at bit level and assignation |
/\= | exclusive OR at bit level and assignation |
>>= | Right shift and assignation |
>>>>= | Right shift filled with zeroes and assignation |
<<= | Left shift and assignation |
islemci | Tanimlama |
= = | Esit |
!= | 'den farkli |
> | 'den buyuk |
< | 'den dusuk |
>= | Esit veya 'den buyuk |
<= | Esit veya 'den kucuk |
Islemci | Tanimlama |
& | logic AND |
| | logic OR |
/\ | logic XOR(exclusive OR) |
|| | shortcut OR |
&& | shortcut AND |
! | unary logic NOT |
&= | AND assignment |
|= | OR assignment |
/\= | XOR assignment |
= = | Equal to |
!= | Not equal to |
?: | Ternary If-then-else ternary |
ternary islemcisinin genel format:
Expression1? expession2 : expression3
Eger Expression1 dogruysa, expresion2 yururluge konulur;yanlis ise, expression3 yururluge konulur.
Operators precedence:
( ) | [ ] | . | |
++ | -- | ~ | ! |
* | / | % | |
+ | - | ||
>> | >>>> | << | |
> | >= | < | <= |
= = | != | ||
& | |||
' | |||
| | |||
&& | |||
|| | |||
?: | |||
= | Op= |
Grup | Cumle | Tanimlama |
Selection | if |
if ( condition ) sentence1; else sentence2; |
various if's |
If (condition ) sentence; else if (condition) sentence; else if (condition) sentence; . . else sentence; |
|
switch |
switch (expression){ case value1: sentence; break; case value2: sentence; break; . ... default : sentence; } |
|
Iteration | while |
while (condition) { sentence; } |
do while |
do { sentences; } while (condition) |
|
for |
for (initialization, condition, iteration) { sentences; } |
|
Jump | break | switch'den cikmak icin.
loop'dan cikmak icin |
continue | Exits from the current loop iteration but continues in the same loop | |
return | Return explicitly from a method |
A sinifi bir nesne icin modeldir ve bir nesne bir sinif icin ornektir.Java kuresel islevleri veya degiskenleri desteklemez, boylece butun program yontemleri bir sinifa tanimlanmalidir.
Bir sinif saklanmis kelime kullanimin tanimlanir.Yaygin bir sinif
tanimlamasi soyle olabilir:
Class class_name { Type instance1_of_variable; Type instance2_of_variable; . . ... type instance_variable; type method_name(parameter_list){ //body of the method } . . .. type name_of_the_method(parameter_list){ //body of the method } } |
Bir sinifin nesnelerini almak icin iki adima gereksinilir:
Dinamiksel olarak hafizayi nesneye atamak ve onun bir referansini almak
icin.Bu ikinci adim yeni operatorun anlami tarafindan yapilir.Genel
gorunumu:
variable = new name_of_the_class(); |
type name_of_the_method (parameter_list) { //method_body } |
Paramete listesi, bir kolonla atrilmis cesit belirteclerinin bir cift ardisligidir.Parametreler, yonteme verilen argumanlarin degerlerini alan degiskenlerdir.Yontem hic bir parametreye sahip degilse, liste bos olacaktir.
"void" 'den farkli bir deger geri donen yontemler sunu kullanirlar:
return valor; |
Java, esnek ve guclu yontemleri onceden hazirlar, bu yuzdenburadan makalenin sonuna kadar, en onemli yontem gorunuslerinin her birini tekrar gozden gecirecegiz.
Buna karsin, devam etmeden once basit bir ornekle butun onceki kavramlara bir goz atalim.
Dikdortgen seklindeki bir kutunun(havuz gibi) kapasitesini hesaplamak icin
bir sinif yaratalim:
Kod | Komutlar |
class capacity { double length; double width; double height; void CalcVolume () { double volume ; volume = length*width*height; System.out.println("Volume: " + volume); } } |
Gorebileceginiz gibi, uzunluk, genislik ve yukseklik gibi uc ornek degere sahip "capacity" adli bir sinif tanimladik.Ayrica akan hacmi hesaplayan bir yontemde tanimlanabilir.capacity.java adli kaynak dosyasini cagiracagiz.Ona derledigimizde bir capacity.class isimli bir sinif yaratilmis olacak. |
Kod | Komutlar |
class example { public static void main(String Arg[]){ capacity p1=new capacity(); capacity p2=new capacity(); p1.length = 16; p1.width=3; p1.height=2; // p2.length = 25; p2.width=6; p2.height=3; // p1.CalcVolume(); // p2.CalcVolume(); } } |
Kapasite cesidinin iki degiskeni p1 ve p2 olarak
tanimlanir.Yeni islemciyle p1,p2 degiskenlerine dogru gonderilebilen
kapasite cesidinin iki nesnesini yaratiriz.
Bundan sonra, yaratilmis nesnelerin her birine deger atariz. p1'de gonderilmis nesnenin Calc Volume() yontemini cagiririz.Bunun sonucunda a: "Volume: 96", ekranda gostyerilecek. p2'de gonderilmis nesnenin aynisi.A: "Volume: 450", ekranda gosterilecek. |
Parametrelerle yontemler.Deger donumu.
Yontemlerin cogunlugu, onlari genellestirmek icin birisine izin veren parametrelerle kullanilir.Bunun yaninda yontemler donum degerleridir, bu yuzden, degisik durumlarda kullanilabilen genis bir seri veriyle calisabilen yontemler yapabiliriz.
Ornegimizi degerlendirecegiz:
Kod | Komutlar |
class capacity { double CalcVolume (double l, double a, double p) { double volume=l*a*p ; return volume; } } |
Uc parametreyi almak icin CalcVolume yontemi nitelendi.Bir cift cesidiyle geri donumu saglamak icin de tanimlanabilir.Bu faaliyet donus hacmi ogrenimi tarafindan yerine getirilir. |
class example { public static void main(String Arg[]){ capacity p1=new capacity(); capacity p2=new capacity(); double vol; vol=p1.CalcVolume(10,3,2); System.out.println("Volume: " + vol); // vol=p2.CalcVolume(25,5,2); System.out.println("Volume: " + vol); } } |
Yonteme cagri, istenen parametrelerin gonderimi yapilir."vol" degiskeninde yontemin degeri geri doner ki yontemle ayni cesitte olmalidir. |
Bir sinifa dahil bir yapici sinifla ayni isme sahiptir.Onu sozdizimi, yontemin burasina benzerdir.O, yeni islemci bitirmeden once, nesneyi yarattikdan sonra otomatikmen isleme doner.
Yapicilar hic bir cesidi geri dondurmezler cunku onlar sinif cesitlerini
geri dondururler.Yapicilar butun nesne durumlarini ilk halleriyle
yuruturler. Bununla birlikte nesnenin bir ornegini yaratan kod onun
kullanimin yapmak icin hazir bir nesneye sahiptir.Yanlis olarak, ornek
degiskenler yepicilar tarafindan ilk hallerine getirilir.Yontemlerle o
meydana gelirken, yapicilar onlari daha yararli yapmak icin parametreye
sahip olabilir.Butun bu yeni gorunusleri tasarlamak icin ornegimizi
niteleyelim.
Kod | Komutlar |
Class capacity { double length; double width; double height; // capacity(double l, double a, double p){ length=l; width=a; height=p; } // void CalcVolume () { double volume ; volume=large*wide*high; return volume; } } |
Bir yapici sinifa eklenebilir ki sinifla ayni isimle, hic bir cesitsiz bir yontemin gotrunusune sahiptir. |
class example { public static void main(String Arg[]) { capacity p1=new capacity(10,5,2); capacity p2=new capacity(25,6,2); double vol; vol=p1.CalcVolume(); System.out.println("Volume: " + vol); // vol=p2.CalcVolume(); System.out.println("Volume: " + vol); } } |
Yeni islemci, bu sinifin yapicisina ihtiyac duyulan parametreleri onaylarken sini ornelerini yaratir. |
Yine de, "finalize" yontemi bir sinifa bitirici eklemek icin kullanilir.Yorumcu nesneyi yiktiginda bu yontem isleme girer.Bu yontemde nesneleri yikmadan once isleme almak icin faaliyetleri icerecegiz.
Yontem Overload.
Polymorphism (bir interface icin bircok yontem) oop'de temel PILLARS'lardan biridir.Java polymorphism'i overload yonteminin anlamlari tarafindan yerine getirir.
Degisik yontemler ayni isimle bir sinif icinde tanimlanabilir, fakat farkli bir parametre listesi veya en azindan farkli donum cesitlerine sahip olmalidir.Overload yontemi cagrildiginda, Java yorumcusu, kullanilacak yontemerin versiyonunu ayirt etmek icin cagriyla onaylanmis argumanlari ve.veya cesitleri kullanir.
Overloaded yontemi, bu polymorphism'i tamamen imkansiz yapsa da degisik gorevleri yerine getirilebilir.Bu yuzden overload bazi iliskileri tercihen belitmelidir.Ayni yolla yontemler ve yapicilar da overload yapilabilir.
Arguman onylama
Genel olarak programlama dilleri argumanlari onaylamak icin iki degisik yola izin verir:
Giris kontrolu
OOP'deki baska bir temel PILLAR ENCAPSULATION'dir.Onu kullanan kodla veri birlesimi anlamina gelir.Daha da fazlasi ENCAPSULATION giris kontrolunu saglar.Bunu soylemek icin programin bir parcasi sinif uyelerini girmek icin yetenege sahip olmalidir.
Java'daki giris ayrintilari 'public', 'private' ve 'protected'dir.
Bir yontem veya bir ornek degisken "public" gibi tanimlandiginda, programin diger herhangi bir parcasindan etkilenebilir.Eger "private" olarak tanimlanirsa, onun kendi sinifinin diger yontemleri tarafindan etkilenebilir.Hatayla butun yontemler veya ornek degiskenler(uyeler) "public"tir.(kendi packet¿?)
The 'protector' belirleyicisi HERENCIAS'la calistiginda kullanilir.(inheritances¿?), Ki bir sonraki konudur.
A super sinifinin ozelliklerini miras alan B sinifini almak icin,B
tanimlanmasinda koyacagiz.
Class B extends A { // class definition } |
Java farkli super siniflardan bir alt sinifa coklu kalita izin vermez.
Eger "private" diye tanimlanan uyeler varsa bunlara kalit siniflarindan girilemez.Bir alt sinifin super sinifa girmesi gerektiginde "super" kelimesi kullanilabilir.Bu yolla yapiciyi veya alt sinif tarafindan saklanan supersinifin uyelerini cagirabiliriz.
Alt sinifin bir yontemi super sinifin yontemi gigi ceside ve ayni isme sahipse, yontemin tekrar yazildigi soylenir.Bu ozellik Java'nin en onemli goruntu temellerinden "Dynamic selection method" unu kurar.Bu her cagirimda hangi yontemin kullanilacagi kararinin ilk degisken cesidine bagimli olarak yururlige kondugu anda yerine getirilecegi analamina gelir.
Bir sonraki makalede kalit'in gucunu abstact siniflari ,interfaceler vb. konularla gorucegiz.In the next article we will see all the power of inheritance, with abstract classes, interfaces, etc.
Bu sanaly�renin
bak�m� Miguel Ángel Sepúlveda taraf�ndan
yap�lmaktad�r. © Jose M. Fernandez 1998 LinuxFocus 1998 |