Yazan : Şadi Evren ŞEKER

Bu yazının amacı, nesne yönelimli programlama konusu altında, sıklıkla geçen nesne dizilerini (object array) anlatmaktır. Kısaca bir dizinin elemanlarına nesne atamanın nasıl olacağı anlatılacaktır.

Öncelikle nesne yönelimli programlama dillerinde, kullanılan nesne atıflarının (object referrer) birer gösterici (pointer) olduklarını bilmemiz gerekir.

Örnek olarak bir sınıf tanımı ile başlayalım:

class insan{
        int yas;
        String isim;
}

Şimdi yukarıdaki sınıftan üretilen bir nesneyi ele alalım:

insan ali = new insan();

Burada ali ismi ile geçen değişken (variable) bir nesne atıfıdır (object referrer) ve insan sınıfından yeni bir nesne üretilmiş, ve bu nesne gösterilmiştir.

Ayırca JAVA dilindeki dizi tanımlamasını da hatırlatalım:

int x[] = new int[5];

Yukarıdaki tanım ile, bir int dizisi tanımlanmıştır. Bu dizinin kendisi de aslında bir nesnedir ve kendisine özgü bazı fonksiyon ve özellikleri bulunur. Ancak konumuz kapsamında 5 elemanlı (0’dan başlayarak 4’e kadar giden (0 ve 4 dahil)) elemanları olduğunu ve int tipinde tanılmandığı için her elemanına birer tam sayı konulabilen (int) bir dizi (array) olduğunu söylememiz yeterlidir.

Artın hatırladığımız dizi tanımı ile nesne tanımını birleştirebiliriz:

insan x[] = new insan[5];

Elemanlarının her biri birer nesne atıfı olan bir dizi tanımlanmıştır. Buna göre dizinin her elemanına, insan tipinden bir nesne göstericisi konulabilir.

Ancak nesne göstericileri için geçerli olan kurallar burada da geçerlidir. Örneğin yukarıdaki tanımdan hemen sonra aşağıdaki gibi bir kullanım hata verecektir:

x[2].yas = 20;

Buradaki hatanın sebebi henüz üretilmemiş olan bir nesnenin bir özelliğine erişiliyor olmasıdır. x[2] ile gösterilen dizinin RAM’de henüz kapladığı yer belirtilmemiş ve dolayısıyla bu alana erişime izin verilmemiştir. Çözüm olarak önce new komutu ile hafızada bu nesnenin yaşayacağı alan tanıtılmalıdır.

x[2] = new insan();

Ancak yukarıdaki şekilde bir tanımlamadan sonra bir önceki adımda hata veren satırı yazıp çalıştırabiliriz.

JAVA dilinde ayrıca for dizilerinin özel bir kullanımı aşağıdaki şekildedir:

for(insan i : x)

Yukarıdaki kod satırı, x dizisinin eleman sayısı kadar döner. Örneğin dizimiz 10 elemanlı ise, döngü 0’dan 9’a kadar dönecek ve her dönüşünde ilgili eleman değerini i isimli nesne göstericisine atayacaktır.

Yukarıda anlatılan bilgiler ışığında, derste yazdığım bir kodu aşağıda yayınlıyorum:

class insan{
        int yas;
        String isim;
        public String toString(){
                return "yas: "+yas+" isim: "+isim;
        }
}

Yukarıdaki kodda, bir insan sınıfı tanımlanmıştır. Bu tanıma göre insanın yaşı ve ismi bulunmaktadır. Ayırca toString ismi verilen özel bir fonksiyon yazılmıştır. Bu fonksiyonun amacı, bu sınıftan (class) üretilen bir nesnenin (object), dizgiye (string) çevrilmesi durumunda otomatik olarak çalışıyor olmasıdır. Aslında bu fonksiyon, her nesne (object) için otomatik olarak tanımlıdır. Bunun sebebi java.lang.Object sınıfında tanımlı bir fonksiyon olmasıdır ve bu fonksiyon her sınıf tanımında ezilebilir (override). Örnek kodumuzda da üzerine yükleme (override) işlemi yapılmış ve fonksiyon ezilmiştir. Böylece insan sınıfından bir nesne, dizgi olarak kullanıldığında fonksiyonda belirtildiği üzere “yas: “ yazısına insanın yaşı eklenecek ardından “isim:” yazısının ardında insanın ismi eklenerek döndürülecektir.

Test amacıyla yazılmış örnek bir kod aşağıda verilmiştir:

 public static void main(String args[]){
                insan i[];
                i = new insan[5];
                insan ali = new insan();
                ali.e = x;
                ali.yas = 20;
                ali.isim= "ali yilmaz";
                System.out.println(" alinin adresi : "+
ali.e.adres);
                i[0] = ali;
                i[1] = new insan();
                i[1].yas = 30;
                i[1].isim = "veli demir";
                System.out.println("i[0]:" +i[0] );
                i[2] = new insan();
                i[3] = new insan();
                i[4] = new insan();
                i[2].isim = "ahmet yildiz";
                i[3].isim = "veli yilmaz";
                i[4].isim = "cem yildiz";
            for(int j=0;j<i.length;j++){
                        i[j].yas =10+ (int)( Math.random() * 40);
                }
                for(insan in : i){
                        System.out.println(in.toString());
                }

        }

Yukarıdaki kodda örnek olarak 5 elemanlı bir insan dizisi oluşturulmuştur. Bu diziye önce ali isimli bir nesne göstericisinin içerisine atanan nesne yerleştirilmiş ( dizinin 0. sırasına) ardından dizinin 1. elemanı için yeni bir nesne oluşturulmuştur. Son olarak dizinin 3., 4. ve 5. elemanları için arka arkaya nesne oluşturulmuş (hafızada yer açılmış) ve isim ataması yapılmıştır. Kodun bundan sonraki kısmında bir döngü ile dizideki bütün insanlara rast gele yaş ataması yapılmıştır (random fonksiyonu) ve ikinci bir döngü ile insanlar ekrana bastırılmıştır. Buradaki bastırma işlemi sırasında insanlar daha önceden tanımlı olan toString fonksiyonu marifetiyle önce dizgiye (string) çevrilmiş ve ardından ekrana bastırılmıştır.

 

Yorumlar

  1. onur616161

    Merhaba hocam

    VB tabanlı olarak Asp.net ile bir form oluşturdum ve bunu dosyaya yazmak istiyorum fakat aşağıdaki kodu yazdığımda şu hatayı alıyorum.

    Hata 1 Handles yan tümcesi, içeren türde veya temel türlerinden birinde tanımlanan WithEvents değişkeni gerektirir. C:UsersOnurDesktopWebSite5Default.aspx.vb 6 62 C:…WebSite5

    Sorun nerdedir acaba?

    Imports System.IO

    Partial Class _Default
    Inherits System.Web.UI.Page
    Protected Sub Kaydet_Click(ByVal sender As Object, _
    ByVal e As EventArgs) Handles Kaydet.Click
    Dim akis As FileStream
    Dim yazici As StreamWriter
    Dim yol As String = Server.MapPath(“kayitlar.txt”)
    akis = New FileStream(yol, FileMode.Append, FileAccess.Write)
    yazici = New StreamWriter(akis)
    Dim İsim As String = TextBox1.Text
    Dim Bölüm As String = TextBox2.Text
    Dim Telefon As String = TextBox3.Text
    Dim BabaAdı As String = TextBox4.Text
    Dim AnneAdı As String = TextBox5.Text
    Dim Adres As String = TextBox6.Text
    yazici.WriteLine(İsim)
    yazici.WriteLine(Bölüm)
    yazici.WriteLine(Telefon)
    yazici.WriteLine(BabaAdı)
    yazici.WriteLine(AnneAdı)
    yazici.WriteLine(Adres)
    yazici.Close()
    akis.Close()
    End Sub
    End Class

  2. onur616161

    Sorun Kaydet buttonunun ID’sini değiştirmeyi unuttuğum içinmiş. Button’un ID’sini de Kaydet olarak değiştirdikten sonra çalıştırdığımda hatasız bir şekilde dosyaya yazdırdı.

    İyi çalışmalar.

onur616161 için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir