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
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
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.
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;
Kalıtım
Şimdi Temel sınıfıyla aynı pakette tanımlanmış bir altsınıfla (subclass) ile yapalım
.
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.
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;
Dikkatli 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.
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.
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.
-
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