Konular

EBooklar

Public, private, protected

Public, Private, Protected

 “Access Modifier”ları, Türkçe’siyle erişim koruma niteleyicileri, bir sınıfın bir metoduna veya bir değişkenine, diğer deyişle, bir sınfın malına kimlerin erişebileceğini belirleyen kelimelerdir. Java dört seviyede erişim koruması sağlar. İşin kafa karıştırıcı yönü ise bu dört seviyenin üç farklı isimle adlandırılmasıdır. Peki dördüncü nasıl adlandırılıyor diyorsanız, Bir sınıf öğesine erişim koruması atamazsanız o varsayılan (default) erişim korumasına sahip olur. Diğer koruma niteleyicileri public, protected ve private’tır.

Öncelikle temel bir sınıf üzerinden örnek verelim

public, private, protected

Temel sınıfında dört farklı seviyeden dört farklı değişken tanımladık. konsolaBasDaBirGörelim metodu da bu dört değişkeni konsola yazdırma görevini üstlendi. Görüldüğü üzere erişim seviyeleri farklı olsa da sınıfın içinden değişkenlere erişmede bir farklılık, sıkıntı yaşanmadı. Erişim niteliyecileri, bu sınıfın dışındaki sınıflardan bu sınıfa olan erişimi kısıtlar. Sınıf içi erişimi kısıtlama gibi bir durum söz konusu değildir.

 Şimdi yeni bir sınıf yaratalım ve bu sınıftan Temel sınıfına yerleştirelim

public, private, protected

Görüldüğü gibi dışarıdaki bir sınıf Temel sınıfının şahsi (private) malları hariç tüm malları erişebilmektedir. ŞahsiMal değişkenine erişmek istediğimizde derleyici hata vermektedir. Temel’in korunaklı mallarına tüm sınıfların erişmesi doğal değildir. Dursun, Temel ile aynı paketten bir sınıf olduğundan dolayı böyle bir geniş erişime sahiptir. Şimdi farklı bir pakette bir sınıf ile erişmeye çalışalım.

public, private, protected

Temel ve Dursun sınıfları accessModifierTestA paketindelerdi. Yukarıdaki John sınıfını ise accessModifierTestB paketinde tanımladık. Görüldüğü üzere John, Temel’in sadece kamu yani public değişkenlerine erişebilmektedir. Dolayısıyla bir tablo yaparsak;

public, private, protected

Kalıtım

Şimdi Temel sınıfıyla aynı pakette tanımlanmış bir altsınıfla (subclass) ile yapalım

public, private, protected.

 

Görüldüğü üzere, aynı paketteki alt sınıf olan UşakA Temel’den kalıtımla aldığı öğelerden sadece şahsi (private) üyelere erişememektedir. Public, private ve default seviyelerine erişim serbesttir.

 

Şimdi aynı örneği accessModifierTestB paketinde tanımlayacağımız UşakB’nin Temel’in hangi üyelerine erişebileceğine bakalım.

public, private, protected

 

UşakB’e Temel’den devraldığı public ve protected üyelere erişimde sıkıntı yaşamamaktadır. Öte yandan default ve private erişim seviyelerine erişememektedir.

 

Dolayısıyla demin hazırladığımız tabloyu güncellersek;

public, private, protectedDikkatli okuyucular hemen UşakA, UşakB örnekleriyle Dursun, John örnekleri arasında önemli bir farkı yakalamıştır. Dursun ve John örneklerinde Temel nesnesine yaratılıp dışarıdan erişim yapılmaktadır. Öte yandan UşakA ve UşakB ise Temel kalıtımla devraldıkları üyeleri erişmektedir. Elbette Dursun ve John, Temel’den türemediği için onlarda böyle bir kalıtım söz konusu değildir. Öte yandan, UşakA ve UşakB, aynı Dursun ve John gibi bir Temel nesnesi yaratıp herhangi bir nesneye erişir gibi Temel nesnesine erişebilir. Acaba bu durumda, erişim kısıtlamaları nasıl çalışmaktadır? Beraber bunun cevabını alalım.

public, private, protected

UşakA için görüldüğü üzere değişen bir durum yoktur. Hatırlayacak olursanız, Dursun’un erişim hakları da UşakA’nın erişim haklarıyla aynıydı. Dolayısıyla aynı paketteki sınıflar için değişen bir kural yoktur. İster temel bir sınfın alt sınıfı olsun, isterse başka bir sınıf, aynı paketteki tüm sınıfların public, protected ve default tüm üyelerine erişebilir.

 

public, private, protected

UşakB için ise değişen bir durum vardır. UşakB, Temel’den devraldığı korunaklı mallara (protected) erişebildiği halde, yarattığı başka bir Temel nesnesinin sadece kamu mallarına (public) erişebilmektedir. Hatırlatacak olursak, her sınıf gibi John sınıfı da sadece Temel’in kamu üyelerine erişebilmektedir. Dolayısıyla bu durum için UşakB ile John arasında bir faklılık bulunmamaktadır.

 

Sonuç

 

1.      Bir sınıfın private (şahsi) üyelerine sadece sınfın kendisi erişebilir.

2.      Aynı paketteki sınıflar birbirlerinin private (şahsi) üyeleri dışında tüm üyelerine erişebilir.

3.      Farklı paketteki bir sınıfın sadece public (kamu) üyelerine erişilebilir. Buna tek istisna, farklı paketteki bir sınıftan türeyen sınıflar içindir. Alt sınıflar, kalıtımla geçen protected (korunaklı) üyelere de erişebilir.

 

public, private, protected

 

Yorumunuzu Ekleyin


Yorumlar

  1. Neyzen fatih
    Allah razı olsun ... konu dediğin böle anlatılır
    teşekkür ederim ...
    16 Eylül 2009 17:43:50, Çarşamba Like
  2. cagdas
    tebrikler
    15 Nisan 2010 18:09:09, Perşembe Like
  3. erol
    emeğine sağlık dostum süper olmuş....
    01 Haziran 2011 23:00:55, Çarşamba Like
  4. burak güder
    Çok orjinal olmuş tebrik ederim :
    19 Ekim 2011 16:21:39, Çarşamba Like
  5. Fikret
    Mükemmel bir makale elinize sağlık
    21 Kasım 2011 23:20:24, Pazartesi Like
  6. emre
    Güzel bir makale. Elinize sağlık. Öte yandan neden public kullanırız neden private kullanırız konusuna açıklık getirmek amacıyla bir ekleme yapılabilir.
    19 Nisan 2013 13:44:52, Cuma Like
  7. Can Eryavuz
    Konu anlatımı için teşekkürler, faydalı ve sade olmuş.
    07 Mayıs 2013 10:19:11, Salı Like
  8. BURAK
    çok iyi olmuş o grafikler
    10 Nisan 2014 02:00:24, Perşembe Like
  9. İdil Aytürk
    Çok eğlenceli ve açıklayıcı bir anlatım gerçekten bayıldım :D
    12 Şubat 2015 00:42:34, Perşembe Like
  10. Semih ( Software Eng)
    Kardeşim şu cümlende bir yanlışlık var sanırsam : "Görüldüğü üzere, aynı paketteki alt sınıf olan UşakA Temel?den kalıtımla aldığı öğelerden sadece şahsi (private) üyelere erişememektedir. Public, private ve default seviyelerine erişim serbesttir."



    Doğrusu : " Public, PROTECTED ve default seviyelerine erişim serbesttir."
    21 Ocak 2016 23:58:49, Perşembe Like
  11. JavaCoder
    Çok teşekkür ederim acıklayıcı ve net bi anlatım kitabınız varsa almak isterim
    22 Ocak 2016 13:31:38, Cuma Like
  12. ayse
    cok tesekkürler! daha iyi anlamak icin türkce kaynaklara baktigimda, daha cok anlamiyorum cünkü direkt tercüme cogu. ama sizin ki gercekten anlasilir, cok sagolun
    20 Mart 2018 21:31:39, Salı Like



  • Java Diziler
  • Java Diziler ~ 47,739

    Javada diziler nesnedirler, cdeki gibi hafızada yer kaplayan pointer değillerdir. Javada diziler, cye göre daha güvenilirdir. Dizilerin elemanlarına gelişigüzel değerler atayamazsınız. Java, dizi elemanlarını sırasıyla kontrol eder. Dolayısıyla arada değer atanmamış bir elemana rastlanırsa hata oluşur. Bu da cde çıkan hafıza bozulmalarını önler. Javada dizi kullanmak için ilk önce dizinin tipi verilir. Tip verilirken dizinin büyüklüğü belirtilmez






  • Java Da Operatörler
  • Java Da Operatörler ~ 32,842

    Aritmetik operatorler 4 işlem ve mod, arttırma operatorleri, ilişkisel operatorler, mantıksal operatorler, kısa devre mantıksal operatorler






  • Stringleri Karşılaştırma
  • Stringleri Karşılaştırma ~ 30,613

    Stringler bilinen = operatörleri ile karşılaştırılmazlar, ayrıca == ve != operatörleride stringler içindeki karakterleri karşılaştırmazlar





  • Java Terimleri
  • Java Terimleri ~ 25,716

    Java, birbirinden farklı aygıtlarda çalışabilen, bu aygıtlar arasında iletişimi kolay hale getiren programlama dili ve platformudur. Java diliyle yazılmış programlar, Windows, UNIX, Mac işletim sistemi yüklü bilgisayarlarda hiç bir değişiklik yapmayı gerektirmeden çalışabilmektedirler




  • Javada Diziler
  • Javada Diziler ~ 24,014

    Java da diziler nesnedir; içerisinde belirli sayıda eleman bulunur. Eğer bu sayı sıfır ise, dizi boş demektir. Dizinin içerisindeki elemanlara eksi olmayan bir tam sayı ile ifade edilen dizi erişim indisi ile erişilir. Bir dizide n tane eleman varsa dizinin uzunluğu da n kadardır; ilk elemanın indisi/konumu 0’dan başlar, son elemanı ise n-1’dir.






  • Java Operatörleri ~ 21,123

    Mod Operatörü, Aritmetik Atama Operatörü, Arttırma Azaltma Operatörleri, Iliskisel Operatorler ve Kısa Devre Iliskisel Operatörler, Kısa devre iliskisel operatorler, ? Operatoru


  • Java 3D
  • Java 3D ~ 20,903

    Son yıllarda çoklu ortamda ilerleme kaydeden Java, Java3D ile yüksek performans isteyen üç boyutlu grafiklerde de 'Ben varım!' diyor.


  • Javada İlk Kod ~ 20,261

    Java classpath tanımlamaları, consolda ilk program yazılması, derlenmesi, çalıştırılması aynı uygulamanın netbeansta yapılışı ve class, java ve jar dosyalarının gösterilmesi