Erişim Belirleyiciler — Kim Hangi Kapıdan Girer?
Önce şunu oku: Sınıf, Nesne ve Kapsülleme — Kuralı Kim Koruyor?
30 saniyede özet
private, paket içi, protected ve public, bir sınıfın parçalarına kimin ulaşabileceğini belirler. En dar kapıdan başlarsın; açtığın her kapı başkalarına verdiğin bir sözdür.
Bir evin ön kapısı misafirlere açıktır, salon aileye, çocuk odası çocuklara, günlüğün ise yalnızca sana. Herkes her odaya girseydi ev bir ev olmaktan çıkardı.
Bir sınıfın parçaları da böyle odalara ayrılır. Java’da bu odaların kapılarına dört kelimeyle anahtar verilir.
Adım adım oku
- private: yalnızca sınıfın kendi kodu girebilir.
- Hiçbir şey yazmazsan: aynı paketteki sınıflar da girebilir.
- protected: paket ve alt sınıflar girebilir.
- public: herkes girebilir.
-
Bayt: Bakiye alanını public yaptım, bir servis onu doğrudan eksiye çekmiş!
-
Sen: Neden public yapmıştın?
-
Bayt: Kolay olsun diye... Ama kolaylık herkese açık kapı demekmiş.
-
Bayt: Kapıları doğru anahtarlarla kilitleyelim. Hepsi dört kelime.
Dört kapı, dört anahtar
Bir erişim belirleyiciBir sınıfın, alanın ya da metodun kimler tarafından kullanılabileceğini belirleyen kelime: private, protected, public ya da hiçbiri (paket içi).Dardan genişe: private (sınıfın kendisi), paket içi (aynı paket), protected (paket ve alt sınıflar), public (herkes).Sözlükte gör →, bir sınıfın, alanın ya da metodun kimler tarafından kullanılabileceğini söyler.
| Yazılan | Kim erişir |
|---|---|
private | Yalnızca sınıfın kendi kodu |
| (hiçbir şey) | Aynı paketteki sınıflar |
protected | Aynı paket ve başka paketteki alt sınıflar |
public | Herkes |
Hiçbir şey yazmadığın duruma paket içiHiçbir erişim belirleyici yazılmadığında geçerli olan erişim: yalnızca aynı paketteki sınıflar kullanabilir.Başka paketteki alt sınıflar bile ulaşamaz. Bir paketin içinde kalan yardımcı sınıflar ve metotlar için kullanışlıdır.Sözlükte gör → erişim denir. Unutulan bir kelime değildir; kendi başına bir seviyedir.
Kafam karıştı, daha basit anlat
Dört kapı var, dardan genişe: yalnızca ben, aynı paket, paket ve çocuklarım, herkes. Hiçbir şey yazmazsan kapı “aynı paket” seviyesinde kalır.
com.banka.hesap paketindeki Hesap sınıfının `protected` bir alanına kimler ulaşabilir? Her sınıfı doğru kutuya koy.
private sınıfa aittir, nesneye değil
Hesap sınıfında `private BigDecimal bakiye;` var. Aynı sınıftaki `boolean ayniMi(Hesap diger)` metodu `diger.bakiye` yazabilir mi? Cevabı göster
Evet, yazabilir. private “bu nesneye özel” değil, “bu sınıfın koduna özel” demektir. Hesap sınıfının kodu, herhangi bir Hesap nesnesinin private alanını okuyabilir.
private bir alanı dışarıdan korur, ama sınıfın kendi kodu bütün nesnelerinin alanlarını görür. equals, compareTo ve kopyalayan kurucular bu yüzden öteki nesnenin private alanlarına rahatça bakabilir.
Koruma sınırı nesne değil, sınıftır. Sınıfın kodunu sen yazdığın için sınıfın kuralını da sen korursun.
Kafam karıştı, daha basit anlat
private, sınıfın kendi odasıdır. O odada çalışan kod, aynı sınıftan olan bütün nesnelerin çekmecelerine bakabilir; dışarıdan gelen hiç kimse bakamaz.
Program ne yazdırır?
Bir alanın önüne hiçbir erişim belirleyici yazmazsan, o alana kimler ulaşabilir?
Satır satır: başka paketten bakınca
Başka bir paketteki bir alt sınıfın, üst sınıfın hangi parçalarına ulaşabildiğine bakalım.
com.banka.vadeli paketinden com.banka.hesap.Hesap'a bakmak
public class VadeliHesap extends Hesap { void dene() { String a = iban; // private String b = sube; // paket içi BigDecimal c = bakiye; // protected String d = sahip(); // public }}Debug
private Derlenmez. private yalnızca Hesap sınıfının kendi koduna açıktır; alt sınıf bile giremez.
- iban
- = ✕
Sol/sağ ok tuşlarıyla da gezebilirsin.
Hangi kapı kime açık?
Tohum 989343Oynat ya da adımla: her adımda bir parçaya ulaşılmaya çalışılır.
Şu an ne oldu?
Başka paketteki alt sınıf, this üzerinden
Hesap’ın dört parçasına tek tek ulaşmaya çalışacak.
Görevler0/3
Alt sınıfken paket içi alana ulaşamamakaçık
İpucu
Varsayılan ayarlar yeter.
Alt sınıfken protected alana ulaşamamakaçık
İpucu
Kimin üzerinden baktığına dikkat.
Başka bir nesnenin private alanını okuaçık
İpucu
Sınıfın kendi kodundan bak.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Başka paketteki alt sınıf, this üzerinden: protected ve public açık, private ve paket içi kapalı.
- “bir Hesap referansı üzerinden” seç. Aynı alt sınıf,
h.bakiyeyazınca protected alana da ulaşamadı. - “Hesap’ın kendi kodu” seç. Dört kapı da açık; başka bir nesnenin private alanı bile.
Başka bir paketteki alt sınıf, üst sınıfın hangi parçalarına doğrudan ulaşabilir?
En dar kapıdan başla
Her şeyi önce private yaz ve yalnızca gerçekten gerektiğinde bir kapı aç. Buna least privilegeBir kullanıcıya, servise ya da ajana yalnızca işini yapmasına yetecek kadar izin vermek. Kandırılsa ya da yanılsa bile yapabileceği zararı sınırlar.Sözlükte gör → ilkesi denir.
public yaptığın her şey başkalarının dayandığı bir sözdür. Bir gün değiştirmek istediğinde, onu kullanan herkesin kodunu da değiştirmen gerekir; private bir parçayı ise istediğin gibi değiştirebilirsin.
Kafam karıştı, daha basit anlat
Kapıyı kapalı başlat, ihtiyaç olunca aç. Açık bir kapıyı kapatmak zordur, çünkü artık birileri o kapıdan geçiyordur.
Yeni bir sınıf yazıyorsun. Alanlar ve yardımcı metotlar için hangi erişimle başlamak en doğrusudur?
Bir bankada bu, hesabın içini dışarıya kapatıp yalnızca güvenli işlemleri açmak demektir: bakiyeye doğrudan yazılmaz, withdraw gibi kuralı bilen bir metot çağrılır.
Derinleş · Hesap: dışarıya yalnızca güvenli kapılar 3 dosya · ~45 satır · ilk okumada atlayabilirsin
Tuzaklar
Alanı public yapmak. Herkes doğrudan yazabilir ve sınıfın kuralı korunamaz. Alanı private yap, gerekiyorsa kuralı bilen bir metot aç.
Rahatlık için protected alan. Alt sınıflar üst sınıfın içine bağımlı olur ve üst sınıfı değiştirmek alt sınıfları bozar. Alt sınıfların ihtiyacını protected bir metotla karşıla, alanı private tut.
Test için her şeyi public yapmak. Test sınıfı çoğu zaman aynı pakettedir; paket içi erişim yeter. Asıl davranışı public metotlar üzerinden test etmek daha da iyidir.
Raporlarda bazı hesapların bakiyesi eksi görünüyor, oysa withdraw metodu buna hiç izin vermiyor. Sorunun kaynağı hangi satır?
Kendini sına
Hiçbir erişim belirleyici yazılmayan bir alan herkese açıktır.
Bir kütüphanenin public bir metodunun imzasını değiştirmek neden bir yardımcı private metodu değiştirmekten çok daha zordur?
Aklında kalacak üç şey
- 1 private yalnızca sınıfın kendi kodu, paket içi aynı paket, protected paket ve alt sınıflar, public herkes içindir.
- 2 private sınıfa aittir, nesneye değil: aynı sınıfın bir nesnesi, başka bir nesnenin private alanını okuyabilir.
- 3 En dar kapıdan başla; public yaptığın her şey başkalarının dayandığı ve kolayca geri alamayacağın bir sözdür.
5 kart sonraki derste seni bekliyor
Bu dersin üstüne kurulanlar
Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.