Veysel Uğur KIZMAZ

Java AutoBoxing

04.04.2012Okunma Sayısı: 4722Kategori: HTML5

 Değişken tanımlaması Java'da 2 çeşittir:

1. Primitive Types ( int, boolean ...)
2. Reference Types (Nesneler ile : Integer, String, ...)
 
Primitive Types:
 
Türkçesi bazı kaynaklarda ilkel veri tipleri diye geçen Primitive Types, hafızanın stack bölümünde yer alan ve kısıtlı sayıda bulunan veri tipleridir: int, short, long, byte, char, double, float
 
Primitive Type ile tanımlanan bir değişken parametre olarak bir methoda gönderildiğinde sadece değeri gönderilir. Örneğin:
 
      public static void main(String[] args) {
            int sayi = 10;
            System.out.println("İlk değer : " + sayi);
            Artir(sayi);
            System.out.println("Son değer : " + sayi);
      }
      private static oid Artir(int sayi){
            sayi++;
      }
 
 
Reference Type:
 
Reference Type olarak belirttiğimiz türler ise class 'lardır.
 
Reference Type ile tanımlanan bir değişken methoda parametre olarak gönderildiğinde, bu değişkenin bellekteki adresi gönderilir. Bu sebeple methodda yapılan tüm değişikliklerden etkilenir. Bunun sebebini şu şekilde örnekleyebiliriz : Primitive Type ile tanımlanan bir değişkende sadece 1 veri bulunurken Reference Type ile tanımlanan bir değişkende binlerce veri bulunabilmektedir. Binlerce verinin bir methoda gönderilirken kopyalanması performans ve bellek kullanımı açısından büyük sıkıntı yaratacaktır. Adresinin gönderilmesi sayesindee içindeki tüm verilere erişebilmekteyiz.
 
Örneğin :
 
public class ReferenceType {
      public static void main(String[] args) {
            Kisi kisi = new Kisi();
            kisi.isim = "Veysel Uğur KIZMAZ";
            kisi.not = 95;
            System.out.println("İlk değer : " + kisi.toString());
            //
            notDegistir(kisi);
            //
            System.out.println("Son değer : " + kisi.toString());
      }
      public static void notDegistir(Kisi k){
            k.not = 100;
      }
}
class Kisi
{
      public String isim;
      public int not;
      public String toString(){
            returnisim + " -> " + not;
      }
}
 
Son olarak, şöyle bir örnek inceleyelim:
 
      publicstaticvoid main(String[] args) {
            int not = 95;
            Integer rNot = new Integer(not);//Boxing
            System.out.println("İlk değer - not : " + not);
            System.out.println("İlk değer - rNot : " + rNot);
            //
            notDegistir(rNot);
            //
            System.out.println("Son değer - not : " + not);
            System.out.println("Son değer - rNot : " + rNot);   
      }
      privatestaticvoid notDegistir(Integer not){
            not = 100;
      }
 
 
Bu örneğimizde Primitive Type olarak tanımlanan not değişenimiz ve not değişkenimizi sarmalayan Reference Type tanılanan rNot değişkenimiz bulunmaktadır. Burada sarmalayan kelimesi bu işlemdeki anahtar kelimemizdir. Bu işleme sarmalamak (wrapping) işlemi denmektedir. Primitive bir değişken, Reference değişken tarafından sarmalanıp işleme alınmaktadır.
 
Örneğimizi çalıştıralım.
 
Not değişkenimizin değeri değişmemektedir. Bunun sebebi, wrapper sınıfların immutable( değişmeyen değerli) özelliğinden kaynaklanmaktadır.
 
 
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com

www.ugurkizmaz.com
twitter: @vukizmaz