İçeriğe geç

Erişim Belirleyiciler — Kim Hangi Kapıdan Girer?

Başlangıç 8 dk Çok sık karşılaşılır

Ö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.

En dar halkadan en genişe: sınıfın kendisi, paket, alt sınıflar, herkes.
Adım adım oku
  1. private: yalnızca sınıfın kendi kodu girebilir.
  2. Hiçbir şey yazmazsan: aynı paketteki sınıflar da girebilir.
  3. protected: paket ve alt sınıflar girebilir.
  4. public: herkes girebilir.
  1. Bayt: Bakiye alanını public yaptım, bir servis onu doğrudan eksiye çekmiş!

  2. Sen: Neden public yapmıştın?

  3. Bayt: Kolay olsun diye... Ama kolaylık herkese açık kapı demekmiş.

  4. 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ılanKim erişir
privateYalnızca sınıfın kendi kodu
(hiçbir şey)Aynı paketteki sınıflar
protectedAynı paket ve başka paketteki alt sınıflar
publicHerkes

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.

Hızlı kontrolBaşlangıç

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.

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Sınıflandırılmamış

Ulaşabilir

Aynı paket ya da alt sınıf.

    Ulaşamaz

    Başka paket ve alt sınıf değil.

      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.

      Hızlı kontrolBaşlangıç

      Program ne yazdırır?

      Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
      Hesap.java
      1class Hesap {
      2 private int bakiye;
      3 Hesap(int bakiye) { this.bakiye = bakiye; }
      4
      5 boolean dahaZengin(Hesap diger) {
      6 return this.bakiye > diger.bakiye;
      7 }
      8}
      9
      10System.out.println(new Hesap(500).dahaZengin(new Hesap(200)));
      Java 21UTF-8LF

      Bir alanın önüne hiçbir erişim belirleyici yazmazsan, o alana kimler ulaşabilir?

      Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

      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

      VadeliHesap.java
      1public class VadeliHesap extends Hesap {
      2 void dene() {
      şu an çalışan satır String a = iban; // private
      4 String b = sube; // paket içi
      5 BigDecimal c = bakiye; // protected
      6 String d = sahip(); // public
      7 }
      8}

      Debug

      Adım 1/4

      private Derlenmez. private yalnızca Hesap sınıfının kendi koduna açıktır; alt sınıf bile giremez.

      iban
      = ✕
      Java 21UTF-8LF3:1

      Sol/sağ ok tuşlarıyla da gezebilirsin.

      Hangi kapı kime açık?

      Tohum 989343

        Oynat ya da adımla: her adımda bir parçaya ulaşılmaya çalışılır.

        Hız
        Adım 0

        Ş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.

        1. Varsayılanla oynat. Başka paketteki alt sınıf, this üzerinden: protected ve public açık, private ve paket içi kapalı.
        2. “bir Hesap referansı üzerinden” seç. Aynı alt sınıf, h.bakiye yazınca protected alana da ulaşamadı.
        3. “Hesap’ın kendi kodu” seç. Dört kapı da açık; başka bir nesnenin private alanı bile.
        Hızlı kontrolBaşlangıç

        Başka bir paketteki alt sınıf, üst sınıfın hangi parçalarına doğrudan ulaşabilir?

        Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

        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.

        Hızlı kontrolBaşlangıç

        Yeni bir sınıf yazıyorsun. Alanlar ve yardımcı metotlar için hangi erişimle başlamak en doğrusudur?

        Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

        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
        Proje dosyaları

        src/main/java/com/bank/account/ Account.java Alanlar private; dışarıya yalnızca kuralı koruyan metotlar açık.

        src/main/java/com/bank/account/Account.java
        public class Account {
        private final String iban;
        private BigDecimal balance;
        public Account(String iban, BigDecimal openingBalance) {
        this.iban = iban;
        this.balance = openingBalance;
        }
        public BigDecimal balance() {
        return balance;
        }
        public void withdraw(BigDecimal amount) {
        if (amount.compareTo(balance) > 0) {
        throw new IllegalStateException("Insufficient funds");
        }
        balance = balance.subtract(amount);
        }
        // private belongs to the class, not the object: another Account's balance is visible here.
        public boolean hasMoreThan(Account other) {
        return balance.compareTo(other.balance) > 0;
        }
        }

        src/main/java/com/bank/account/ IbanFormat.java Paket içi bir yardımcı: yalnızca aynı paketteki sınıflar kullanır.

        src/main/java/com/bank/account/IbanFormat.java
        // No modifier: only classes in com.bank.account can use it.
        final class IbanFormat {
        private IbanFormat() {
        }
        static String grouped(String iban) {
        return iban.replaceAll("(.{4})", "$1 ").trim();
        }
        }

        src/main/java/com/bank/web/ Main.java Başka paketten kullanım ve çıktı yorumlarda.

        src/main/java/com/bank/web/Main.java
        public class Main {
        public static void main(String[] args) {
        Account account = new Account("TR000001", new BigDecimal("100"));
        account.withdraw(new BigDecimal("30"));
        System.out.println(account.balance()); // 70
        // account.balance = BigDecimal.ZERO; does not compile: private
        // IbanFormat.grouped("TR000001"); does not compile: other package
        }
        }

        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.

        Hızlı kontrolBaşlangıç

        Raporlarda bazı hesapların bakiyesi eksi görünüyor, oysa withdraw metodu buna hiç izin vermiyor. Sorunun kaynağı hangi satır?

        Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

        Hatalı satıra dokun, sonra kontrol et.

        Account.java
        Java 21UTF-8LF

        Kendini sına

        Şimşek turu1/4

        Hiçbir erişim belirleyici yazılmayan bir alan herkese açıktır.

        Soru 1/3Orta

        Bir kütüphanenin public bir metodunun imzasını değiştirmek neden bir yardımcı private metodu değiştirmekten çok daha zordur?

        Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

        Aklında kalacak üç şey

        1. 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. 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. 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.
        Sonraki kapı Üst sınıfta tek bir satır değişti ve alt sınıfın sayacı ikiye katlandı. Nasıl olur? Kalıtım ve Kompozisyon — Kimin İç Ayrıntısına Bağlısın? · 8 dk

        5 kart sonraki derste seni bekliyor

        0/3 kart bu dersten toplandı

        Bu dersin üstüne kurulanlar

        Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.