Merhaba Arkadaslar,
Bu yazimda Java da Assignment/atama operatorunu (= yani esittir) ve dogal olarak da degiskenler uzerinde incelemelerde bulunacagiz.
Oncelikle degisken nedir ? Degiskenler Java da birer bit tutuculardir/ bit holders.
int , double, String, Button, String[] turunde degisken yani bit tutucular tanimlayabiliriz.
primitive degiskenleri inceleyecek olursak. Ornegin ; byte bir degisken dusunelim ve degeri 6 olsun , Java da 1 byte 8 bittir. Bu durumda 6 degeri ,bit pattern/yapi 00000110 olarak temsil edilir.
Button b = new Button();
b hakkinda ne diyebiliriz peki ?
b bir reference variable / referans degiskendir ve Button objesine referansta bulunmaktadir. Bir referans degisken de bit holder/tutucudur.Yani tuttugu bu bitler ilgili objeye nasil ulasacaginin bilgisini tasir. Bit formatini bilememekteyiz
Button b = null;
b, hic bir objeye referansta bulunmuyor ,anlamina gelmektedir.
Incelemeye devam edelim ve bir kac ornek verelim, bunlara zaten yabanci degiliz.
int x=10; //literal assignment int y=x+2; //assignment with an expression int z=x*y; //assignment with an expression
Burada dikkat cekmek istedigim konu tamsayi literallerinde varsayilan tur int tir. Bir onceki konuda literal konusuna deginmistik.
byte b = 10; //automatically narrows literal value to a byte byte b = (byte) 10; // explicitly cast the int literal to a byte
Ilk satirdaki atama islemi gecerlidir. Burada Compiler/derleyici otomatik olarak literal int degeri byte degere cevirir. Ikinci satirda oldugu gibi explicity/acik bir sekilde byte degere cast islemi yapilmaktadir. Bu ornegimiz short degisken icin de gecerlidir. Simdi de su ornegimizi inceleyelim;
byte a = 5; byte b = 10; byte c = b+c; //compiler error
Burada 1 ve 2.satirda sorunsuzca atama islemi gerceklesecektir. Fakat 3.satirda derleme hatasi alacagiz. Peki boyle basit bir islemde 5+10 degerinin 15 , yani byte degerinin sinirinda olmasinda bile neden hata aldik ?
Java ciddi bir programlama dilidir ve son derece titiz bir denetim soz konusudur. Bu hatanin nedeni sudur ; possible loss of precision // yani muhtemel veri kaybi.
Javada , expression/ifade tamsayi degerleri icin int e yukseltilir. yani b+c bir expression/ifadedir dolayisiyla 15 degeri int e yukseltilir. Daha sonrasinda bu int 15 degerini byte degere atamaya calisiyoruz, Java buna izin vermeyecektir.
Bu sorunu cozmek icin, explicitly/ acik bir sekilde cast islemi yapmamiz gerekir;
byte c = (byte)(a+b);
Primitive Casting
Casting; bir primitive/ilkel turden baska bir ilkel ture donusturme islemidir.Onceki yazilarda bahsetmistim burada biraz daha detaylica inceleyecegiz.
Casting islemi explicit/acik veya implicit/kapali olabilir.
implicit cast ornegi;
int a=100; long b=a; // implicit // kapali cast islemi
burada a degiskenini b degiskenine direkt olarak atadik. Bir int turunde degiskeni long turunde degiskene direkt olarak atayabiliriz. Benzer sekilde bir byte degiskeni short, int, long degiskene , bir short degiskeni int ve long degiskene direkt olarak atayabiliriz.
Explicit cast ornegi;
float f = 124.232f; long b = (int) f;
burada float turunde bir degisken acik bir sekilde / explicit cast islemine tabi tutuluyor. Eger parantez icerisinde (int) ifadesini yazmazsak Java bize kizacak ve derleme zamani hatasi verecektir. Bu ifade ile derleyiciye sunu diyoruz bu cast islemini gerceklestir ve veri kaybini onayliyorum, yani b degerimiz 124 olacaktir, virgulden sonraki kisim atilacaktir.
tamsayi primitive/ilkel tipleri (byte, short, int, long) degiskenler explicit/kapali bir sekilde double veya float degiskene atanabilirler.
double d=100L; int a=10; float f=a; long c=1000; float g=c;
tamsayi primivite degiskenlere noktali/float sayilar atayamayiz.
int a=10.5; short s=20.2; byte b=30.0;
Assigning Float Numbers
Daha once belirtigim gibi Java da noktali kayan sayilar / floating-point implicity/kapali sekilde double dir, float degildir ! Yani 30.5 literali float degil double dir.
//float f=30.5; //compiler error. float f2 = (float) 30.5; float f3 = 30.5f; float f4 = 30.5F; float f5=30;
Bir kac ek bilgi daha verelim ;
byte b = 128; //compiler error
Bu atama islemi hata verecektir. Neden peki ? Hatirlayacagimiz gibi Java da bir byte degiskeni 8 bittir ve 256 deger tutabilir. Bir byte degiskeni -128 ve 127 arasinda bir deger tutabilir. 128 degeri bu sinirin disindadir ve Java bu duruma kizacaktir, derleme zamaninda bize hata verecektir.
Su ornegimizi inceleyelim;
Java da bu atama ifadesi sorunsuzca calisacaktir.
byte b = 3; b += 5;
Su ifade de cast islemi yapmamiz gerekir;
byte b = 3; //b=b+5; compiler error b =(byte)(b+5);
Degiskenler ve cesitli atamalarla ilgili biraz kod yazmak noluyor diye gormek faydali olacaktir.