Previous
Next

JAVA - Access specifiers(Erişim belirleyicileri) nedir?

by Cem Kefeli 20. Mayıs 2010 07:16

JavaÇoğu zaman, hayatın her alanında bazı kısıtlamalar ile karşılaşıyoruz. Eğer bir şeylere sahiplik varsa onun saklanması, korunması da çok doğal bir istektir. Herkes, her zaman herşeyini birileri ile paylaşmak istemeyebilir. Daha da ötesi paylaşmasının çok da uygun olmayabileceğini düşünebilir. İzinsiz kullanımın, yetkisiz kullanımın önüne geçilmesi için de böyle bir yapı şarttır aslında. Programlama dillerindeki access specifiers(erişim belirleyicileri) kavramı da tamamen bu doğal dürtünün sonucunda ortaya çıkmıştır. Ben bir sınıf yazıp bunu bir pakatin içerisinde başkaları ile paylaşabilirim. Başkalarının da yazdığım kod parçacıklarından faydalanamasını sağlayabilirim. Fakat sınıf içerisinde yer alan bazı değişkenlerin kimse tarafından değiştirilememesini, bazı yordamların override edilememesini isteyebilirim. Kodun sahibi olarak bunları isteyebilmek benim en doğal hakkımdır aslında. Şöyle toparlayabiliriz bu kısmı; erişim belirleyicileri, programcı tarafından oluşturulan her bir yazılım öğesinin paylaşım sınırlarını belirlemek için kullanılmaktadır. Şimdi bu konuyu biraz daha açmanın zamanı geldi...

Java Access Specifiers - Erişim Belirleyicileri Öncelikle şunu söyleyeyim, yandaki şekil gözünüzü korkutmasın. İş hiç de şekilde görüldüğü gibi karışık ve öğrenilmesi güç bir sey değil. Aslında bu şekli gördükten sonra üzerinde konuşmaya da çok fazla gerek yok. Çünkü bu şekil ne var ne yok gayet güzel bir şekilde açıklıyor olayı. Yine arada ekleyeceğimiz kısa notlar olacaktır. Bizim bu belirteçlerden özellikle üzerinde duracağımız public, friendly, private, protected erişim belirleyicileridir.

İlk önce friendly erişim belirleyicisi ile başlamak istiyorum. Friendly erişim belirleyicisi java dili için standart erişim belirleyicisidir. Yani eğer herhangi bir erişim belirteci yoksa friendly olarak kabul edilir. Bu erişim belirleyicisi metodlara, sınıflara ve alanlara uygulanabilmektedir. Özelliği ise aynı paket içerisindeki tüm sınıflardan bu üyelere erişilebilirken, paket dışı üyelerden bu üyelere erişilememektedir. Burada enteresan olan ise bu erişim belirleyicisinin kullanılmasının istenmemesidir. Yani bir metodun, sınıfın ya da alanın başına friendly anahtar sözcüğünün yazılması istenmemektedir. Yazarsanız hata ile karşılaşabilirsiniz. Eğer bir üyeyi friendly olarak tanımalamak isterseniz yapmanız gereken o alanı boş bırakmaktır.

Public erişim belirleyicsi tüm üyeler tarafından herhangi bir sınırlama olmadan erişilebilmektedir. Hem sınıflara, hem metodlara, hem de alanlara uygulanabilmektedir bu erişim belirleyicisi. Public erişim belirleyicisine sahip bir üyeye hem paket içinden hem paket dışından, hem tanımlandığı sınıftan hem tanımlandığı sınıf dışından, kullanıldığı sınıftan türetilen tüm sınıflardan erişilebilmektedir.

Private erişim belirleyicisi yalnızca metodlara ve alanlara uygulanabilmektedir. Sınıf tanımlamaları için ise bu belirteç kullanılamamaktadır. Private olarak tanımlanan bir üyeye yalnızca tanımlandığı sınıf içerisinden erişilebilmektedir. Yani aynı paket içerisindeki bir başka sınıftan ya da farklı bir paketten bu üyelere erişim yapılması yasaklanmıştır. Peki ama bu sınıfların içerisindeki değişkenlere erişilmek ve farklı değerlere setlenmek istendiğinde ne yapılacaktır. Bu değerler tamamen sabit ve değiştirilemez midir? Tabiki değil. İşte tam bu aşamada encapsulation(kapsülleme) kavramı karşımıza çıkıyor. Kapsüllemeyi temel olarak dışarıdan erişimi yasaklanmış üyelerin değerlerinin özelleşmiş metodlar yardımı ile değiştirilebilmesi olarak tanımlayabiliriz. Bu özelleşmiş metodlar içerisinde değeri değiştirilmek istenen üyelerin kontrollü bir şekilde değer değişiklikleri de yapılabilmektedir. Aşağıda az önce bu bahsettiklerim ile ilgili birkaç örnek ver alıyor.

Main.java  |  Netbeans Projesini indir AccessSpecifiers1.rar (12,06 kb)  |  Gizle  |  Göster
/**
 *
 * @author Cem KEFELI
 * http://www.cemkefeli.com
 */

package accessspecifiers1;

public class Main
{
    public static void main(String[] args)
    {
        sinif1 class1 = new sinif1();
        class1.SayilariYaz();
        class1.Sayi1 = 5;
        System.out.println("class1.setSayi2(20): "+class1.setSayi2(20));
        System.out.println("class1.setSayi2(4000): "+class1.setSayi2(4000));
        class1.SayilariYaz();
        // sinif2 class2 = new sinif2();
        sinif2.Yaz("sinif2.Yaz()");
    }
}
sinif1.java  |  Netbeans Projesini indir AccessSpecifiers1.rar (12,06 kb)  |  Gizle  |  Göster
/**
 *
 * @author Cem KEFELI
 * http://www.cemkefeli.com
 */

package accessspecifiers1;

public class sinif1
{
    public int Sayi1;
    private int Sayi2;
    //
    public sinif1()
    {
        System.out.println("sinif1()");
        this.Sayi1 = 50;
        this.Sayi2 = 3500;
    }
    public boolean setSayi2(int Sayi)
    {
        if( (Sayi<1000 && Sayi>500) || (Sayi<5500 && Sayi>3000) )
        {
            this.Sayi2 = Sayi;
            return true;
        }
        else
        {
            return false;
        }
    }
    public void SayilariYaz()
    {
        System.out.println("Sayi1: "+Sayi1);
        System.out.println("Sayi2: "+Sayi2);
    }
}
sinif2.java  |  Netbeans Projesini indir AccessSpecifiers1.rar (12,06 kb)  |  Gizle  |  Göster
/**
 *
 * @author Cem KEFELI
 * http://www.cemkefeli.com
 */

package accessspecifiers1;

public class sinif2
{
    private sinif2()
    {
        System.out.println("sinif2()");
    }
    public static void Yaz(String Metin)
    {
        System.out.println(Metin);
    }
}
Program Çıktısı  |  Gizle  |  Göster
run:
sinif1()
Sayi1: 50
Sayi2: 3500
class1.setSayi2(20): false
class1.setSayi2(4000): true
Sayi1: 5
Sayi2: 4000
sinif2.Yaz()
BUILD SUCCESSFUL (total time: 0 seconds)

İlk önce sinifların içeriklerinden başlayalım. sinif1 sınıfı içersinde birisi public birisi ise private erişim belirtecine sahip iki tane integer türünden değişken var. SayilariYaz isimli metod bu değişkenlerin o an için sahip olduğu değerleri yazıyor. SetSayi2 isimli metod ise Sayi2 değişkeninin değerini setliyor. Eğer değerler bizim istediğimiz ve belirttiğimiz koşullara uyuyor ise true uymuyor ise ise false değerini geri döndürüyor bu metod. sinif2 sınıfının yapıcısı dikkatinizi çekmiş olmalı. Çünkü private türden belirtilmiş. Bu konuya tekrar geri döneceğiz. sinif2 sınıfı içerisindeki Yaz isimli metod static void türündendir ve kendisine gönderilen string değişkenleri yazdırmaktadır.

Programın nasıl çalıştığına bakacak olursak; main metodu içerisinde ilk önce sinif1 türünden class1 isimli bir değişken oluşturulduğu görülecektir. class1 daha yeni oluşturulurken yapıcısı çağırılır ve Sayi1, Sayi2 değişkenlerine başlangıç değerleri olan 50 ve 3500 değerleri atanır. Program çıktısına bakacak olursanız yapıcı metod içerisinde bu değerlerin 50 ve 3500 olarak yazdırıldığını da göreceksiniz. 15. satırda Sayi1 değişkenine 5 değerini atıyoruz fakat Sayi2 değişkenine bu şekilde bir atama yapmamız mümkün değil. Çünkü private olarak tanımlanmış bulunmakta. 16. satırda SetSayi2 metodu çağırılarak Sayi2'ye 20 değeri atanmak isteniyor fakat bu metod içerisinde izin verilen aralıklar arasında olmadığı için değer setlenemiyor ve false döndürülüyor. 17. satırda atanmak istenen 4000 değeri izin verilen aralıklarda olduğu için Sayi2 4000 değerine setleniyor ve değeri değiştirilmiş oluyor. Program çıktısına da bakacak olursanız değerini setleyen metodun true döndürdüğünü göreceksiniz. Sinif2 sınıfının yapıcı metodu private tanımlandığı için bu sınıfa ait bir nesne örneği tanımlanamaz. Az önce yarım bıraktığımız sorunun cevabını da böylece vermiş oluyoruz. Bu sınıf içerisinde static bir metod var. Yeri gelmişken söylemek gerekir. Static metodlar ait oldukları sınıfa ait nesne örneğinden çağrılmasına gerek kalmadan nokta vuruşu yaparcasına çağırılabilmektedir.

Protected erişim belirleyicisi ise kalıtım kavramı ile iç içe geçmiştir. Protected tanımlanan bir üyeye farklı bir paket içerisinden erişilememekte fakat aynı paket içerisinden erişilebilmektedir. Private üyelere ne olursa olsun sınıf dışından erişilememekteydi fakat protected üyelere türetildikleri sınıflardan erişilebilmektedir.Ayrıca protected erişim belirleyicisi tıpkı private gibi sınıflara uygulanamamaktadır.

Yorum ekle

biuquote
  • Yorum
  • Canlı önizleme
Loading

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General