24 Soru: Java'da genel, korumalı, özel paket ile özel arasındaki fark nedir?

tarafından oluşturulan soru Tue, Sep 11, 2018 12:00 AM

Java’da, public ve protected’u yaparken ve devralma ile ilgilenirken, varsayılan (özel paket), private, class ve interface’un her erişim değiştiricisini ne zaman kullanacağınıza ilişkin net kurallar var mı?

    
2860
  1. private, paket içindeki diğer sınıflardan gizlenir. public paket dışındaki sınıflara maruz kalıyor. protected, yalnızca alt sınıflarla sınırlı olan public'un bir sürümüdür.
    2013-02-13 09: 56: 53Z
  2. @ Tennenrishin - Hayır; C ++ 'ın aksine, Java protected'da bu metodu tüm paketten de erişilebilir kılmaktadır. Java’nın görünürlük modelindeki bu aptallık protected’un hedefini bozuyor.
    2013-08-21 09: 51: 49Z
  3. @ Nicolas Tüm paketten protected'la veya protected ile erişilebilir. Bir erişim değiştiricisi olarak, protected'un tek yaptığı paketin altındaki alt sınıflara maruz kalmaktır.
    2014-03-14 10: 59: 36Z
  4. @ tennenrishin - peki, Nicolas'un söylediği buydu ... ve şimdi onu tekrarlıyorsunuz. İlk başta söylediğin şey, protected-package - ve ben de teklif ediyorum - 'sadece alt sınıflarla sınırlı olan bir halk sürümüdür', korumanın tüm paket üzerinden erişime izin verdiğinden, kendi girişiniz tarafından doğrulanmayan bir durumudur (ergo, alt sınıflara erişim.)
    2014-04-07 13: 45: 38Z
  5. Ayrıca, Java’daki Java’daki korumalı erişim modunun aptalca olduğuna da katılıyorum. Olan şey Java'nın yatay (kafes) ve dikey erişim kısıtlama niteleyicilerini bir araya getirmesidir. Varsayılan kapsam, kafesin paket olmasıyla birlikte yatay /kafes kısıtlamasıdır. Halk, kafesin bütün dünya olduğu başka bir yatay kısıtlamadır. Özel ve (C ++) korumalı dikeydir. Kesin bir erişime sahip olsaydık, örneğin, ihtiyaç duyduğumuz nadir durumlarda protected'u korumamız daha iyi olurdu,
                │ Class │ Package │ Subclass │ Subclass │ World
                │       │         │(same pkg)│(diff pkg)│ 
    ────────────┼───────┼─────────┼──────────┼──────────┼────────
    public      │   +   │    +    │    +     │     +    │   +     
    ────────────┼───────┼─────────┼──────────┼──────────┼────────
    protected   │   +   │    +    │    +     │     +    │         
    ────────────┼───────┼─────────┼──────────┼──────────┼────────
    no modifier │   +   │    +    │    +     │          │    
    ────────────┼───────┼─────────┼──────────┼──────────┼────────
    private     │   +   │         │          │          │    
    
     + : accessible         blank : not accessible
    
    'u korumalı C ++ sürümüne eşdeğer tutuyordu.
    2014-04-07 13: 53: 34Z
24 Yanıtlar                              24                         

Resmi eğitici sizin için biraz yararlı olabilir .

 friend     
5208
2019-02-14 02: 29: 37Z
  1. Aynı sınıfta ancak korunan bir yönteme veya örnek değişkenine erişmeye çalışıyorsanız, ancak .equals (Klass var) örneğinde olduğu gibi bir nesneye erişmeye çalışıyorsanız işe yarıyor mu?
    2013-02-06 15: 17: 57Z
  2. Alt sınıflar üst sınıflarıyla aynı paketdeyse, varsayılan alanlar alt sınıflarda görünür.
    2013-08-14 08: 24: 51Z
  3. Java ve JDK sürümlerinde 1.0.1'e kadar olan sürümlerde, yöntemlere veya değişkenlere erişimi kısıtlayacak başka bir koruma biçimi oluşturmak için özel ve korumalı kullanabilirsiniz yalnızca belirli bir sınıfın alt sınıflarına.
    2013-08-22 01: 37: 02Z
  4. Soruyu cevaplamayan bir cevaba verilen oy çoktur, bu her bir görünürlüğü ne zaman kullanmalıyız? efektler).
    2014-01-28 23: 37: 59Z
  5. @ Bohemian - Cevap, mümkün olduğunda en az izin verilen erişim belirticisini kullanmanız gerektiğini bildiğinizi varsayar (veya bu tavsiyeyi veren bağlantıyı izleyerek tam cevabı okuduğunuzu varsayar).
    2014-08-25 21: 29: 12Z

(Caveat: Java programcısı değilim, Perl programcısıyım. Perl resmi bir korumaya sahip değil, bu yüzden sorunu neden bu kadar iyi anlıyorum :))

Özel

Düşündüğünüz gibi, yalnızca bildirildiği sınıf onu görebilir.

Paket Özel

Yalnızca ilan edildiği paket tarafından görülebilir ve kullanılabilir. Bu, Java’daki varsayılan değerdir (bazıları hata olarak görür).

Korunan

Özel Paket +, alt sınıflar veya paket üyeleri tarafından görülebilir.

Genel

Herkes görebilir.

Yayınlandı

Kontrol ettiğim kodun dışında görülebilir. (Java sözdizimi olmasa da, bu tartışma için önemlidir).

C ++ "arkadaş" adında ek bir seviye tanımlar ve bu konuda ne kadar az şey bilirseniz o kadar iyi.

Ne zaman ne kullanmalısın? Tüm fikir bilgi gizlemek için kapsüllemedir. Kullanıcılarınızdan bir şeyin nasıl yapıldığının ayrıntılarını mümkün olduğunca gizlemek istersiniz. Niye ya? Çünkü o zaman onları daha sonra değiştirebilir ve kimsenin kodunu çözemezsiniz. Bu, bir başkasının elden geçirdiğiniz kodu kullandığından endişe etmeden hataları optimize etmenize, yeniden yapılandırmanıza, yeniden tasarlamanıza ve düzeltmenize olanak sağlar.

Öyleyse, kurallara uymak, işleri yalnızca olması gerektiği kadar görünür kılmaktır. Özel ile başlayın ve yalnızca gerektiği kadar daha fazla görünürlük ekleyin. Sadece kullanıcının bilmesi için kesinlikle gerekli olanı kamuya açın, kamuoyuna verdiğiniz her ayrıntı sistemi yeniden tasarlama yeteneğinizi kısıtlar.

Kullanıcıların, davranışlarını özelleştirebilmelerini istiyorsanız, iç halkaları halka açık yapmak yerine onları geçersiz kılmak için özelleştirmelerini istiyorsanız, bu bağırsakları bir nesneye sokmak ve bu arayüzü herkese açık hale getirmek daha iyi bir fikirdir. Böylece yeni bir nesneyi kolayca bağlayabilirler. Örneğin, bir CD çalar yazıyorsanız ve "bu CD hakkında bilgi bul" bit'inin özelleştirilebilir olmasını istiyorsanız, bu yöntemleri herkese açık yapmak yerine, tüm bu işlevselliği kendi nesnesine koyar ve yalnızca nesne alıcınızı /ayarlayıcınızı genel yaparsınız . Bu şekilde bağırsaklarınızı açığa vurmak için cimri olmak, iyi bir kompozisyon ve endişelerin ayrılmasını teşvik eder

Şahsen ben sadece "özel" ve "kamu" ile sopa. Birçok OO dili sadece buna sahiptir. "Korumalı" kullanışlı olabilir, ama bu gerçekten bir hile. Bir arayüz özelden daha fazla olduğunda, kontrolünüz dışındadır ve kullanım bulmak için diğer kişilerin kodlarına bakmanız gerekir.

Burası “yayınlanmış” fikrinin geldiği yerdir. Arayüzün değiştirilmesi (yeniden düzenlenmesi), onu kullanan tüm kodu bulup değiştirmenizi gerektirir. Arayüz özel ise, sorun değil. Korunuyorsa gidip tüm alt sınıflarını bulmalısın. Genel ise, kodunuzu kullanan tüm kodu bulmanız gerekir. Bazen bu mümkündür, örneğin dahili kullanım için olan kurumsal kod üzerinde çalışıyorsanız, bir arayüzün genel olup olmadığı önemli değildir. Tüm kodu şirket havuzundan alabilirsiniz. Ama eğer bir arayüz "yayınlandı" ise, kontrolünüz dışında kullanan bir kod varsa, o zaman hortumlanırsınız. Bu arayüzü veya risk kırma kodunu desteklemelisiniz. Korunan arabirimler bile yayınlanmış sayılabilir (bu yüzden korumalılar ile uğraşmıyorum).

Birçok dil kamu /korumalı /özel hiyerarşik yapısını çok kısıtlayıcı ve gerçeklikle uyumlu bulmaz. Bu amaçla bir özellik sınıfı kavramı var, ancak bu başka bir şov.

    
429
2013-10-15 19: 17: 06Z
  1. arkadaşlar - > "Hakkında ne kadar az şey biliyorsan o kadar iyi" --- > Paket gizliliğinden hala üstün olan seçici görünürlük sağlar. C ++ 'da bunun kullanımları vardır, çünkü tüm fonksiyonlar üye fonksiyonlar olamaz ve arkadaşlar halktan daha iyidir. Elbette kötü beyinlerin kötüye kullanma tehlikesi var.
    2011-06-07 10: 13: 39Z
  2. C ++ 'da" korumalı "nın farklı bir anlamı olduğu da belirtilmelidir - korumalı bir yöntem etkin bir şekilde özeldir, ancak yine de mirasçı bir sınıftan çağrılabilir. (Java'nın aksine, içindeki herhangi bir sınıf tarafından aranabileceği gibi Aynı paket.)
    2011-10-02 12: 34: 23Z
  3. @ RhysvanderWaerden C #, bu yönüyle C ++ ile aynıdır. Java’nın alt sınıfa erişebilecek bir üyeyi ilan etmesine izin vermediğini, paketin tamamını değil, oldukça garip buluyorum. Bu bana ters geliyor - bir paket çocuk sınıfından daha geniş kapsamlıdır!
    2013-10-15 17: 36: 01Z
  4. @ KonradMorawski IMHO paketi alt sınıftan daha küçük kapsamdır. Sınıfınızın finalini ilan etmediyseniz, kullanıcılar bunu alt sınıfa koyabilmelidir - yani java korumalı yayınlanmış arayüzünüzün bir parçasıdır. OTOH, paketler dolaylı olarak tek bir kuruluş tarafından geliştirilmiştir: ör. com.mycompany.mypackage. Eğer kodunuz kendimi paketimde ilan ederse, dolaylı olarak kendinizi organizasyonumun bir parçası olarak ilan edersiniz, bu yüzden iletişim kurmalıyız. Bu nedenle, paket, alt sınıftan (nesnemi genişleten kişiler) daha küçük /daha kolay bir kitleye (şirketimdeki insanlar) yayınlar ve böylece daha düşük görünürlük olarak sayılır.
    2014-05-22 20: 37: 39Z
  5. i, sınıflar arasındaki özel ilişkileri tanımlamak için iyidir. Doğru kullanıldığında birçok durumda üstün kapsülleme sağlar. Örneğin, ayrıcalıklı bir fabrika sınıfı tarafından dahili bağımlılıkları inşa edilmiş bir tipe enjekte etmek için kullanılabilir. Adı kötü, çünkü iyi tasarlanmış bir nesne modelini doğru bir şekilde korumayı umursamayan insanlar iş yüklerini hafifletmek için kötüye kullanabilirler.
    2014-12-08 10: 05: 29Z

İşte tablonun daha iyi bir sürümü. (Modüller için bir sütun ile gelecek kanıtı.)

 Java Access Değiştiricileri

açıklamalar

  • Bir özel üye (j), yalnızca ilan edildiği gibi aynı sınıfta erişilebilir durumdadır.

  • Erişim değiştiricisi olmayan (k) üyesine yalnızca aynı paketteki sınıflar içinde erişilebilir.

  • Korumalı bir üyeye (l), aynı paketteki tüm sınıflarda ve diğer paketlerdeki alt sınıflarda erişilebilir.

  • Bir genel üyeye (long internalCounter) tüm sınıflara erişilebilir (eğer bir modülü bildirildiği paketi dışa aktarmaz).


Hangi değiştirici seçilsin?

Erişim düzenleyicileri, yanlışlıkla (*) enkapsülasyonunun bozulmasını önlemenize yardımcı olacak bir araçtır. Üyenin sınıfa, pakete, sınıf hiyerarşisine dahil olmayan bir şey olup olmadığına kendin sor, kendin için bir erişim düzeyi seç ve buna göre erişim seviyesini seç.

Örnekler:

  • Bir alan void beforeRender(), değişken ve uygulama ayrıntısından dolayı büyük olasılıkla özel olmalıdır.
  • Yalnızca bir fabrika sınıfında (aynı pakette) başlatılması gereken bir sınıf, kısıtlı bir kurucuya sahip olmalıdır, çünkü onu doğrudan paket dışından çağırmanız mümkün olmamalıdır.
  • Oluşturulmadan hemen önce çağrılan ve alt sınıflarda kanca olarak kullanılan dahili bir void saveGame(File dst) yöntemi korunmalıdır.
  • GUI kodundan çağrılan
                    | highest precedence <---------> lowest precedence
    *———————————————+———————————————+———————————+———————————————+———————
     \ xCanBeSeenBy | this          | any class | this subclass | any
      \__________   | class         | in same   | in another    | class
                 \  | nonsubbed     | package   | package       |    
    Modifier of x \ |               |           |               |       
    ————————————————*———————————————+———————————+———————————————+———————
    public          |       ✔       |     ✔     |       ✔       |   ✔   
    ————————————————+———————————————+———————————+———————————————+———————
    protected       |       ✔       |     ✔     |       ✔       |   ✘   
    ————————————————+———————————————+———————————+———————————————+———————
    package-private |               |           |               |
    (no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
    ————————————————+———————————————+———————————+———————————————+———————
    private         |       ✔       |     ✘     |       ✘       |   ✘    
    
    yönteminin genel olması gerekir.

(*) Kapsülleme tam olarak nedir?

    
358
2018-11-14 14: 48: 54Z
  1. Sadece şunu söylüyorum: kırmızı /yeşil renklendirmeyi ayırt etmede problem yaşayan birçok insan var. Kırmızı /yeşil (veya sarı /turuncu /...) renklendirme şemalarını kullanan tablolar, hiçbir şeyde nadiren "daha iyi" olur ;-)
    2018-10-11 10: 50: 55Z
  2. @ GhostCat, katılmıyorum. Bence kırmızı /yeşil birçok insan için "işler" /"çalışmaz" ile sezgisel olarak hizaya giriyor, yani çok , birçok alternatiften daha iyidir.
    2018-11-14 14: 10: 01Z
  3. colourblindawareness.org/colour-blindness/… ... Renk körü erkeklerin% 8'i yaklaşık olarak% 1 oranında 1 deuteranop,% 1 oranında protanop,% 1 oranında protanomal ve % 5 oranında deuteranomal olarak ayrılabilir. /b>. Ve% 5'inin% 50'sinden biri olduğum için emin olun: kırmızı /yeşil berbat.
    2018-11-14 14: 13: 01Z
  4. @ GhostCat Tamam .. nüfusun beklediğimden daha büyük bir kısmı. Resmi bu renk körlüğü simülatörüne yükledim ve hepsini farklı test ettim modları. Tek renkli /akromatopsi modunda bile renk farkı makul. Farkı görebiliyor musun yoksa simülatör kapalı mı? (Kırmızı /yeşilin insanları renkli görmek için çok sezgisel olduğu kanısındayım.)
    2018-11-14 14: 32: 51Z
  5. Farkı görebiliyorum, ancak Almanya'da sürücü ehliyeti için yapmamız gereken renk körlüğü testlerinin yarısını geçebiliyorum ;-) .. ama böyle bir simülatörün "yeterince iyi" olduğunu düşünüyorum.
    2018-11-14 14: 40: 26Z
 protected     
181
2018-03-06 14: 51: 26Z
  1. Kelimelerde yazılmaya değer - "Korumalı değiştirici, nesneyi diğer paketler arasında kullanılabilir kılar, oysa varsayılan /değiştirici aynı pakete erişimi kısıtlıyor"
    2016-08-15 16: 53: 24Z
  2. @ vanguard69, protected değiştiricisi, işaretli şeyini (sınıf, yöntem veya alan) başka bir pakette başka bir sınıfa sunabilir hale getiriyor sadece iff diğer sınıfın, private işaretli şey 'nin ilan edildiği sınıfın bir alt sınıfı olduğunu söyledi.
    2016-08-15 18: 14: 00Z
  3. "nonsubbed"? "başka bir pakette bu alt sınıf"? Huh. Java’yı tanıdığımı sanıyordum.
    2017-12-10 12: 24: 09Z
  4. @ AlexanderFarber, belirli bir tarayıcı yapılandırması için optimize ettiniz mi? Bu şimdi benim kromum ve bu Firefox
    2017-12-10 12: 29: 08Z
  5. Hmm, yaptığım değişiklikten sonra geri dönelim
    2017-12-10 14: 26: 26Z

Kolay kural. Her şeyi özel olarak ilan etmeye başlayın. Ve sonra ihtiyaçlar ortaya çıktığında halkla birlikte ilerler ve tasarım bunu garanti eder.

Üyeleri teşhir ederken, temsil seçimlerini mi yoksa soyutlama seçimlerini mi bıraktığını kendin sor. İlki, gözlemlenebilir davranışından ziyade asıl temsile çok fazla bağımlılık getireceği için kaçınmak istediğiniz bir şeydir.

Genel bir kural olarak, alt-sınıflandırma yoluyla yöntem uygulamalarını geçersiz kılmaktan kaçınmaya çalışıyorum; mantığı mahvetmek çok kolaydır. Geçersiz kılmayı düşünüyorsanız, soyut korumalı yöntemleri beyan edin.

Ayrıca, yeniden tararken işlerin kırılmasını önlemek için geçersiz kılınırken @Override ek açıklamasını kullanın.

148
2018-07-24 14: 45: 18Z
  1. @ RuchirBaronia, "world" = uygulamadaki tüm kodlar, nerede olursa olsun.
    2016-02-26 19: 12: 13Z

Aslında basit bir ızgara gösterisinden biraz daha karmaşık. Kılavuz size bir erişime izin verilip verilmediğini söyler, ancak tam olarak bir erişimi oluşturan nedir? Ayrıca, erişim düzeyleri iç içe sınıflarla ve kalıtımla karmaşık şekillerde etkileşime girer.

"Varsayılan" erişim (bir anahtar kelimenin yokluğu ile belirtilir) ayrıca paket olarak adlandırılır -özel

Özet

Bu erişim belirticisine sahip bir üyeye erişim izni var mı?

  • Üye protected’dur: Yalnızca üye arama koduyla aynı sınıf içinde tanımlanmışsa.
  • Üye özel bir pakettir: Yalnızca arayan kod, üyenin hemen paketini içeren paketin içindeyse.
  • Üye public: Aynı paket veya çağıran kodu içeren sınıfın bir üst sınıfında üye tanımlanmışsa,
  • Üye public: Evet.

Hangi erişim belirticileri için geçerlidir

Yerel değişkenler ve biçimsel parametreler erişim belirticilerini alamaz. Kapsam belirleme kurallarına göre doğal olarak dışarıya erişilemediklerinden, etkin bir şekilde özeldirler.

Üst sınıftaki sınıflar için yalnızca protected ve özel paket kullanımına izin verilir. Bu tasarım seçiminin muhtemelen private ve public'un paket düzeyinde yedekli olacağı için (paketlerin miras kalmaması) tahmin ediliyor.

Tüm erişim belirticileri sınıf üyelerinde (inşaatçılar, yöntemler ve statik üye işlevleri, iç içe sınıflar) mümkündür.

İlgili: Java Sınıfı Erişilebilirlik

Sipariş

Erişim belirticileri kesinlikle sipariş edilebilir

  

genel > korumalı > özel paket > Özel

private’un en fazla, private[this]’un en fazla erişimi sağladığı anlamına gelir. Özel bir üye için mümkün olan herhangi bir referans, paket-özel bir üye için de geçerlidir; Özel paket üyesine yapılan herhangi bir referans, korunan bir üye vb. için geçerlidir. (Korunan üyelere aynı paketteki diğer sınıflara erişim izni verilmesi bir hata olarak kabul edildi.)

Notlar

  • Bir sınıfın yöntemlerinin, aynı sınıftaki diğer nesnelerin özel üyelerine erişmesine izin verilir. Daha kesin olarak, bir C sınıfı yöntemi, C'nin herhangi bir alt sınıfındaki nesnelerdeki özel C üyelerine erişebilir. Java, örneğin yalnızca sınıflara göre erişimi kısıtlamayı desteklemez. (
    class Test {
        public static void main(final String ... args) {
            System.out.println(Example.leakPrivateClass()); // OK
            Example.leakPrivateClass().secretMethod(); // error
        }
    }
    
    class Example {
        private static class NestedClass {
            public void secretMethod() {
                System.out.println("Hello");
            }
        }
        public static NestedClass leakPrivateClass() {
            return new NestedClass();
        }
    }
    
    kullanarak desteklediği Scala ile karşılaştırın.)
  • Bir nesne oluşturmak için bir yapıcıya erişiminiz olması gerekir. Bu nedenle, eğer tüm kurucular özelse, sınıf sadece sınıf içinde yaşayan kodla oluşturulabilir (tipik olarak statik fabrika yöntemleri veya statik değişken başlatıcılar). Benzer şekilde paket özel veya korumalı inşaatçılar için.
    • Yalnızca özel kuruculara sahip olmak aynı zamanda sınıfın dışsal olarak alt sınıflandırılamayacağı anlamına gelir, çünkü Java bir alt sınıfın kurucularının örtük olarak veya açıkça bir üst sınıf kurucu olarak çağırılmasını gerektirir. (Bununla birlikte, alt sınıflara yerleştirilmiş iç içe bir sınıf içerebilir.)

İç sınıflar

İç sınıflar gibi iç içe geçmiş kapsamları da göz önünde bulundurmanız gerekir. Karmaşıklığın bir örneği, iç sınıfların kendileri değiştiricilere erişebilecekleri üyelere sahip olmasıdır. Böylece bir kamu üyesi ile özel bir iç sınıfa sahip olabilirsiniz; üyeye erişilebilir mi? (Aşağıya bakın.) Genel kural, kapsamı araştırmak ve her seviyeye erişip erişemeyeceğinizi görmek için özyinelemeli düşünmektir.

Ancak, bu oldukça karmaşık ve tüm ayrıntılar için Java Dil Belirtimi'ne bakın . (Evet, geçmişte derleyici hatalar oldu.)

Bunların nasıl etkileştiğinin tadına bakmak için bu örneği düşünün. Özel iç sınıfları "sızdırmak" mümkündür; bu genellikle bir uyarıdır:

 
Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

Derleyici çıktısı:

 private

Bazıilgili sorular:

104
2017-05-23 12: 34: 59Z
  1. "kamu dışındaki değiştiriciler yasaktır" - Java 9'dan itibaren durum böyle değil: arayüzler de özel yöntemlere sahip olabilir.
    2018-08-25 20: 34: 52Z

Temel kural olarak:

  •  default: sınıf kapsamı.
  •  package-private (veya protected): paket kapsamı.
  •  package scope + child: public (paket gibi, ancak farklı paketlerden sınıflandırabiliriz). Korunan değiştirici her zaman "ebeveyn-çocuk" ilişkisini korur.
  •  
    +—-———————————————+————————————+———————————+
    |                 |    Same    | Different |
    |                 |   Package  | Packages  |
    +—————————————————+————————————+———————————+
    | private         |   D        |           |
    +—————————————————+————————————+———————————+
    | package-private |            |           |
    | (no modifier)   |   D R I    |           |
    +—————————————————+————————————+———————————+
    | protected       |   D R I    |       I   |
    +—————————————————+————————————+———————————+
    | public          |   D R I    |    R  I   |
    +—————————————————+————————————+———————————+
    
    : her yerde.

Sonuç olarak, erişim hakkını üç haklara bölersek:

  • (D) doğru (aynı sınıftaki bir yöntemden veya "bu" sözdizimi aracılığıyla çağrılır).
  • (R) farklılığı (sınıfa bir başvuru kullanarak veya "nokta" sözdizimi aracılığıyla bir yöntemi çağırın).
  • (I) Kalıtım (alt sınıflandırma yoluyla).

o zaman bu basit tablonuz var:

 public     
80
2019-06-25 15: 55: 24Z
  1. Bu cevap daha fazla yükseltme hak ediyor.
    2018-10-12 10: 39: 07Z
  2. Teşekkürler, doğru olarak işaretlenmiş cevaptan daha anlaşılır bir şey.
    2019-06-25 14: 22: 31Z

Çok kısa sürede

  •  protected: her yerden erişilebilir.
  •  private: aynı paketin sınıfları ve herhangi bir paketin içinde bulunan alt sınıflar tarafından erişilebilir.
  • varsayılan (değiştirici belirtilmemiş): aynı paketin sınıfları tarafından erişilebilir.
  •  protected: Yalnızca aynı sınıfta erişilebilir.
47
2016-09-24 07: 05: 08Z

Java’daki en yanlış anlaşılan erişim değiştiricisi Father’dur. Alt sınıfların görebildiği bir istisna dışında varsayılan değiştiriciye benzer olduğunu biliyoruz. Ama nasıl? İşte karışıklığı umarımda netleştiren bir örnek:

  • 2 sınıfımız olduğunu varsayalım; Her biri kendi paketindeki Son ve

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
    :  foo()
  • Father -

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
    arasında korumalı bir yöntem ekleyelim.  foo()
  • foo() yöntemi 4 bağlamda çağrılabilir:

    1. fatherpackage'un tanımlandığı aynı pakette bulunan bir sınıfın içinde (

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
      ):  this
    2. Bir alt sınıfın içinde, şu anki durumda super veya

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
      aracılığıyla:  
      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
      
    3. Türü aynı sınıf olan bir referansta:

       foo()
    4. Türü ana sınıfı olan ve olan bir referansta, , fatherpackage'un tanımlandığı paket (

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
      ) [Bu, bağlam no. 1]:

       foo()
  • Aşağıdaki durumlar geçerli değil.

    1. Türü, ana sınıf olan ve dışında olan bir referansta, fatherpackage'un tanımlandığı paket (

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
      ):  
      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      
    2. Bir alt sınıfın bir paketindeki alt sınıf olmayan bir sınıf (Bir alt sınıf, korunan üyeleri üst öğesinden miras alır ve bunları alt sınıf olmayanlara özel kılar):

       Object#clone()
40
2017-09-14 19: 35: 16Z
  1. protected, super.foo() üyesinin bir örneğidir.
    2013-11-15 20: 08: 13Z
  2. f.foo() ile ilk geçersiz durum protected'u yapmak arasındaki fark nedir?
    2017-10-28 09: 18: 14Z
  3. @ cst1992 Kafa karıştırıcı ancak Java Dili Özelliği 6.6.2'ye bakın: "Bir nesnenin korumalı bir üyesine veya yapıcısına, bildirildiği paketin dışından erişilebilir yalnızca bu nesnenin uygulanmasından sorumlu olan kodla ". Super.foo () ile "super" referansı "uygulamadan doğrudan sorumludur", ancak "f" referansı değildir. Niye ya? Çünkü "süper" nin "Baba" tipinde olduğundan% 100 emin olabilirsin; çalışma zamanında başka bir alt baba türü olabilir. docs.oracle.com adresine bakın. /javase /gözlük /jls /SE9 /html /...
    2018-01-30 17: 55: 17Z
  4. protected'u anlayan birinden bir yanıt okumak için canlandırıcı. Maalesef, bu sayfadaki
    // Saved in file A.java
    package pack;
    
    class A{
      void msg(){System.out.println("Hello");}
    }
    
    // Saved in file B.java
    package mypack;
    import pack.*;
    
    class B{
      public static void main(String args[]){
       A obj = new A(); // Compile Time Error
       obj.msg(); // Compile Time Error
      }
    }
    
    ’u tanımlayan diğer tüm cevaplar onu biraz yanlış anlıyor.
    2018-07-11 06: 20: 57Z

Özel

  • Yöntemler, Değişkenler ve Yapıcılar

Özel olarak ilan edilen Yöntemler, Değişkenler ve Yapıcılara yalnızca belirtilen sınıfın içinde erişilebilir.

  • Sınıf ve Arabirim

Özel erişim değiştiricisi, en kısıtlayıcı erişim seviyesidir. Sınıf ve arayüzler özel olamaz.

Not

Sınıfta genel alıcı yöntemleri varsa, sınıfta özel ilan edilen değişkenlere sınıf dışından erişilebilir. Bir üst sınıfta korunan ilan edilen değişkenlere, yöntemlere ve kuruculara yalnızca diğer paketlerdeki alt sınıflar veya korumalı üyelerin sınıfının paketi içindeki herhangi bir sınıftan erişilebilir.


Korunan

  • Sınıf ve Arabirim

Korumalı erişim değiştiricisi sınıfa ve arayüzlere uygulanamaz.

Yöntemler, alanlar korumalı olarak bildirilebilir, ancak arabirimdeki yöntemler ve alanlar korumalı olarak bildirilemez.

Not

Korumalı erişim, alt sınıfa, ilgisiz bir sınıfın kullanmayı denemesini engellerken yardımcı yöntemi veya değişkeni kullanma şansı verir.


Genel

Genel olarak ilan edilen bir sınıfa, yönteme, yapıcıya, arabirime vb. başka bir sınıftan erişilebilir.

Bu nedenle, genel bir sınıf içinde bildirilen alanlara, yöntemlere, bloklara Java Evrenine ait herhangi bir sınıftan erişilebilir.

  • Farklı Paketler

Ancak erişmeye çalıştığımız genel sınıf farklı bir paketteyse, genel sınıfın hala içe aktarılması gerekir.

Sınıf mirası nedeniyle, bir sınıfın tüm genel yöntemleri ve değişkenleri alt sınıfları tarafından miras alınır.


Varsayılan -Hiçbir anahtar kelime yok:

Varsayılan erişim değiştiricisi, bir sınıf, alan, yöntem vb. için açıkça bir erişim değiştiricisi bildirmediğimiz anlamına gelir.

  • Aynı Paketlerde

Erişim kontrolü değiştiricisi olmadan bildirilen bir değişken veya yöntem, aynı paketteki diğer herhangi bir sınıf için kullanılabilir. Bir arabirimdeki alanlar dolaylı olarak genel statik finaldir ve bir arabirimdeki yöntemler varsayılan olarak geneldir.

Not

Statik alanları geçersiz kılamazız. Eğer geçersiz kılmaya çalışırsanız herhangi bir hata göstermez ancak bizim dışımızdakiler işe yaramıyor.

İlgili Yanıtlar

Referanslar bağlantıları

http://docs.oracle.com/javase/tutorial/java /javaOO /accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

    
27
2017-05-23 11: 47: 36Z

Özel : Yalnızca sınıfa sınırlı erişim

Varsayılan (değiştirici yok) : Sınıf ve pakete sınırlı erişim

Korumalı : Sınıf, paket ve alt sınıflara sınırlı erişim (hem içeride hem de dışarıda)

Genel : Sınıfa, her yere (tümü) ve alt sınıflara erişilebilir ... Kısacası, her yere.

    
17
2017-11-11 22: 26: 19Z

Farklılık daha önce verilen bağlantılarda bulunabilir ancak hangisinin kullanılacağı genellikle "En Az Bilgi İlkesi" ne bağlıdır. Yalnızca gereken en düşük görünürlüke izin verin.

    
16
2008-10-18 20: 00: 34Z

Erişim düzenleyicileri, erişimi birkaç düzeyde kısıtlamak için oradadır.

Genel: Temelde, aynı pakette olsun veya olmasın, herhangi bir sınıftan erişebileceğiniz kadar basittir.

Aynı paketteyseniz erişmek için doğrudan erişebilirsiniz, ancak başka bir paketteyseniz sınıfın bir nesnesini oluşturabilirsiniz.

Varsayılan: Aynı pakette, herhangi bir paket sınıfından erişilebilir.

Size erişmek için sınıfın bir nesnesini oluşturabilirsiniz. Ancak bu değişkene paket dışında erişemezsiniz.

Korumalı: aynı paketteki değişkenlere ve başka bir paketteki alt sınıflara erişebilirsiniz. bu nedenle, temelde varsayılan + Devralındı ​​ davranışıdır.

Temel sınıfta tanımlanan korumalı alana erişmek için alt sınıf nesnesi oluşturabilirsiniz.

Özel: aynı sınıfa erişebilir.

Statik olmayan yöntemlerde, bu referans nedeniyle (ayrıca yapıcılarda) doğrudan erişebilirsiniz, ancak statik yöntemlere erişmek için sınıfın nesnesini oluşturmanız gerekir.

    
14
2017-11-11 22: 28: 20Z

Java’daki değiştiricilere erişin.

Java erişim değiştiricileri, Java'da erişim kontrolü sağlamak için kullanılır.

1 . Varsayılan:

Yalnızca aynı paketteki sınıflar için erişilebilir.

Örneğin,

 
// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

Bu erişim herkese açık ve korumalı, ancak özelden daha az kısıtlıdır.

2 . Genel

Her yerden erişilebilir. (Küresel Erişim)

Örneğin,

 
class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}
  

Çıktı: Merhaba

3 . Özel

Yalnızca aynı sınıf içinde erişilebilir.

Bir sınıftaki diğer üyelere özel üyelere erişmeye çalışırsanız derleme hatası verilir. Örneğin,

 
// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

4 . Korumalı

Yalnızca aynı paketteki sınıflara ve alt sınıflara erişilebilir

Örneğin,

 default
  

Çıktı: Merhaba

 Buraya resim açıklaması girin

    
14
2017-11-11 22: 38: 17Z

Sadece bu sayfadaki cevapların çoğu da dahil olmak üzere, genel olarak yanlış giden bir ayrıntıya değinmek istiyorum. "Varsayılan" erişim (erişim değiştiricisi olmadığında) her zaman özel paket ile aynı değildir . Bu şeyin ne olduğuna bağlı.

  • Üye olmayan türler (başka bir tür içinde bildirilmeyen sınıflar, numaralandırmalar, arabirimler ve ek açıklama türleri) pack'lerdir.varsayılan olarak yaşa özel. ( JLS §6.6.1 )

  • Sınıf üyeleri ve yapıcılar varsayılan olarak paket özeldir. ( JLS §6.6.1 )

  • Enum yapıcıları varsayılan olarak özel . (Gerçekten de, enum inşaatçılar özel olmalı ve onları herkese açık ya da korunmuş kılmaya çalışmak bir hatadır). Enum sabitleri geneldir ve herhangi bir erişim belirticisine izin vermez. Diğer enums üyeleri varsayılan olarak paket özeldir. ( JLS §8.9 )

  • Tüm arayüz ve açıklama türlerinin üyeleri varsayılan olarak herkese açıktır . (Gerçekten de, arayüzlerinin ve ek açıklama türlerinin üyeleri herkese açık olmalıdır ve onları özel veya korumalı hale getirmeye çalışmak bir hatadır.) ( JLS §9.3 - 9.5 )

12
2015-10-21 12: 07: 06Z
  1. Ve sonra, yeni gelenleri şaşırtmak için, Java 8'deki arayüz yöntemlerine yeni ve parlak
    String name = "john";
    
    public int age(){
        return age;
    }
    
    değiştirici eklendi :)
    2015-10-29 10: 41: 05Z
  • genel - uygulamanın herhangi bir yerinden erişilebilir.

  • varsayılan - paketten erişilebilir.

  • korumalı - diğer paketteki paket ve alt sınıflardan erişilebilir. yanı sıra

  • özel - yalnızca sınıfından erişilebilir.

12
2016-03-16 15: 31: 37Z

Pakete görünür. Varsayılan. Değiştiriciye gerek yok.

Yalnızca sınıfa görünür ( özel ).

Dünyaya görünür ( genel ).

Paket ve tüm alt sınıflara görünür ( korumalı ).

Değişkenler ve yöntemler, çağrılan herhangi bir değiştirici olmadan bildirilebilir. Varsayılan örnekler:

 
Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

Özel erişim değiştiricisi - özel:

Özel olarak ilan edilen metotlar, değişkenler ve kuruculara sadece ilan edilen sınıf içinde erişilebilir. Özel erişim değiştiricisi en kısıtlayıcı erişim seviyesidir. Sınıf ve arayüzler özel olamaz.

Özel olarak tanımlanan değişkenlere, sınıfta genel alıcı yöntemleri varsa sınıfın dışında erişilebilir.

Özel değiştiriciyi kullanmak, bir nesnenin kendisini kapsüllemesi ve dış dünyadaki verileri gizlemesinin ana yoludur.

Örnekler:

 
public void cal(){

}

Genel erişim değiştiricisi - genel:

Genel ilan edilen bir sınıf, yöntem, yapıcı, arayüz vb. diğer sınıflardan erişilebilir. Bu nedenle, genel bir sınıf içinde ilan edilen alanlara, yöntemlere, bloklara Java evrenine ait herhangi bir sınıftan erişilebilir.

Ancak, erişmeye çalıştığımız genel sınıf farklı bir paketteyse, genel sınıfın hala içe aktarılması gerekir.

Sınıf mirası nedeniyle, bir sınıfın tüm genel yöntemleri ve değişkenleri alt sınıfları tarafından miras alınır.

Örnek:

 
class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

Korumalı erişim değiştiricisi - korumalı:

Bir üst sınıfta korunan ilan edilen değişkenlere, yöntemlere ve kuruculara yalnızca başka bir paketteki alt sınıflar veya korumalı üyelerin sınıfının paketi içindeki herhangi bir sınıftan erişilebilir.

Korumalı erişim değiştiricisi sınıfa ve arabirimlere uygulanamaz. Yöntemler, alanlar korumalı, ancak bir arabirimdeki yöntemler ve alanlar korumalı olarak bildirilemez.

Korumalı erişim, alt sınıfa yardımcı olmayan bir sınıfın kullanmayı denemesini engellerken yardımcı yöntemi veya değişkeni kullanma şansı verir.

 
╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝
    
12
2017-11-11 22: 32: 21Z

Bu sayfa korumalı ve amper hakkında iyi yazar ; varsayılan erişim değiştiricisi

.... Korumalı: Korumalı erişim değiştiricisi biraz zor ve varsayılan erişim değiştiricisinin üst kümesi olduğunu söyleyebilirsiniz. Korunan üyeler, aynı paketteki erişim açısından, varsayılan üyelerle aynıdır. Buradaki fark, korunan üyelere, aynı zamanda üyenin bulunduğu sınıfın bulunduğu paketin dışında bulunan, üyenin ilan edildiği sınıfın alt sınıflarına da erişilebilir olmasıdır.

Ancak bu korunan üyelere “paket dışında yalnızca kalıtım yoluyla erişilebilir”. yani, bir sınıfın korumalı bir üyesine, başka bir pakette bulunan alt sınıfındaki bir üyeye doğrudan, alt sınıfın kendisinde mevcut gibi erişebilirsiniz. Ancak bu korumalı üyeye, ebeveyn sınıfının referansını kullanarak paketin alt sınıfında erişilemez. ....

    
10
2017-11-11 22: 23: 45Z
  1. Sadece şunu eklemek için "Çocuk ana sınıfın korumalı üyesine erişince, özel olur (veya daha doğrusu tarafından miras alınabilecek özel bir özel üye olduğunu söyleyebilirim) alt sınıfın alt sınıfları) alt sınıfın üyesi. "
    2012-10-27 18: 55: 36Z

David'in cevabı, her erişim değiştiricisinin anlamını sağlar. Her birinin ne zaman kullanılacağıyla ilgili olarak, tüm sınıfları ve harici kullanım için amaçlanan her bir sınıfı ve yöntemlerini (API) ve diğer her şeyi gizli tutmanızı öneririm.

Zaman içinde, bazı sınıfların ne zaman özel olacağı ve alt sınıflarda kullanım için korunan belirli yöntemleri ne zaman açıklayacağınız konusunda bir fikir edinebilirsiniz.

    
8
2017-11-11 22: 22: 55Z

Not: Bu, kabul edilen yanıt için yalnızca bir tamamlayıcıdır .

Bu, Java ile ilgilidir Erişim Düzenleyicileri .

Java Erişim Düzenleyicileri 'den:

  

Bir Java erişim değiştiricisi, hangi sınıfların belirli bir sınıfa erişebileceğini belirtir   sınıf ve alanları, yapıcıları ve yöntemleri. Erişim değiştiricileri   Bir sınıf, yapıcıları, alanları ve   yöntemleri. Java erişim değiştiricileri ayrıca bazen günlük olarak da adlandırılır.   Java erişim belirteci olarak konuşma, ancak doğru ad Java erişim   düzenleyiciler. Sınıflar, alanlar, yapıcılar ve yöntemler olabilir   dört farklı Java erişim değiştiricisi:

     
  • Öğeyi listele
  •   
  • Özel
  •   
  • varsayılan (paket)
  •   
  • korumalı
  •   
  • kamu
  •   

Bir Sınıfın Üyelerine Erişimi Kontrol Etme derslerinden

  

Erişim seviyesi değiştiricileri, diğer sınıfların kullanıp kullanamayacağını belirler.   belirli bir alanı veya belirli bir yöntemi çağırır. İki seviye vardır   erişim denetimi:

     
  • Üst düzeyde - genel veya paket özel (açık bir değişiklik yok).
  •   
  • Üye düzeyinde - genel, özel, korumalı veya özel paket (açık bir değişiklik yok).
  •   

Değiştirici genel ile bir sınıf ilan edilebilir, bu durumda   sınıf her yerde tüm sınıflar tarafından görülebilir. Bir sınıfın değiştiricisi yoksa   (varsayılan, özel paket olarak da bilinir), yalnızca görünür   kendi paketi içinde

     

Aşağıdaki tablo, her birinin izin verdiği üyelere erişimi göstermektedir.   modifiye edici.

 Default      

İlk veri sütunu, sınıfın kendisinin erişimi olup olmadığını gösterir.   erişim seviyesi tarafından tanımlanan üye. Gördüğünüz gibi, her zaman bir sınıf   kendi üyelerine erişimi var. İkinci sütun ise olup olmadığını gösterir.   sınıfla aynı paketteki sınıflar (ne olursa olsun   veli) üyeye erişimi var. Üçüncü sütun   sınıfın alt sınıflarının çıkarılıp çıkarılmadığıide bu paket var   üyeye erişim. Dördüncü sütun, tüm sınıfların olup olmadığını gösterir.   üyeye erişimi var.

     

Erişim düzeyleri sizi iki şekilde etkiler. İlk önce, bu sınıfları kullandığınızda   Java platformundaki sınıflar gibi başka bir kaynaktan   erişim seviyeleri, bu sınıfların hangi üyelerine sahip olduğunuzu belirler   sınıfları kullanabilir. İkincisi, bir sınıf yazdığınızda, karar vermeniz gerekir.   Her üye değişkeni ve sınıfınızdaki her yöntem için hangi erişim seviyesi   olmalı.

    
6
2016-11-17 05: 05: 01Z
  1. ek tam olarak nedir ve neden mevcut yayına düzenleme yapmıyor?
    2016-11-17 15: 39: 31Z
  2. eki Erişim Düzenleyicileridir. Neden düzenleme yapmıyorsunuz? Kabul edilen cevabı tarihi hatır için değiştirmeden tutmak ve cevabımı vermek.
    2016-11-18 02: 25: 25Z

Genel Korumalı Varsayılan ve özel erişim değiştiricileridir.

Kapsülleme ya da sınıfın içeriğini gizleme ve gösterme amaçlıdırlar.

  1. Sınıf herkese açık veya varsayılan olabilir
  2. Sınıf üyeleri genel, korumalı, varsayılan veya özel olabilir.

Özel sınıf dışında erişilebilir değil Varsayılan ayarlara yalnızca pakette erişilebilir. Pakette ve onu genişleten herhangi bir sınıfta korumalı. Genel herkese açık.

Normalde, üye değişkenleri özel olarak tanımlanır, ancak üye yöntemleri geneldir.

    
5
2014-07-30 03: 51: 40Z
  1. public bir erişim değiştiricisi değil ve diğerlerinden ikisi yanlış yazılmış.
    2016-09-24 03: 13: 49Z

Çoğu zaman, herhangi bir dilin temel kavramlarını hatırlamanın, gerçek dünyadaki analojiler oluşturarak mümkün olabileceğini anladım. İşte Java'da erişim değiştiricileri anlamak için benim analojim:

Üniversitede bir öğrenci olduğunuzu ve hafta sonu sizi ziyarete gelen bir arkadaşınız olduğunu varsayalım. Üniversitenin kurucusunun kampüsün ortasında büyük bir heykeli bulunduğunu varsayalım.

  • Onu kampüse getirdiğinde, senin ve arkadaşının ilk gördüğü şey bu heykel. Bu, kampüste yürüyen herkesin üniversitenin izni olmadan heykele bakabileceği anlamına gelir. Bu, heykeli PUBLIC

  • yapar.
  • Ardından, arkadaşınızı yatakhanenize götürmek istiyorsunuz, ancak bunun için onu ziyaretçi olarak kaydetmeniz gerekiyor. Bu, kampüsteki çeşitli binalara girmesi için bir erişim izni (sizinkiyle aynı) olduğu anlamına gelir. Bu erişim kartını PROTECTED

  • yapacaktır.
  • Arkadaşınız kampüsün WiFi ağına giriş yapmak istiyor, ancak bunu yapacak herhangi bir kimlik bilgisi yok. Çevrimiçi olabilmesinin tek yolu giriş bilgilerinizi onunla paylaşmanızdır. (Unutmayın, üniversiteye giden her öğrenci aynı zamanda bu giriş bilgilerine sahiptir). Bu, giriş bilgilerinizi NO MODIFIER olarak değiştirir.

  • Son olarak, arkadaşın web sitesinde yayınlanan dönem için ilerleme raporunu okumak istiyor. Ancak, her öğrencinin kampüs web sitesinin bu bölümüne erişmek için kendi kişisel giriş bilgileri vardır. Bu, bu kimlik bilgilerini PRIVATE

Bu yardımcı olur umarım!

    
5
2017-04-06 04: 09: 22Z

Erişim düzenleyicilerini düşündüğünüz zaman, sadece bu şekilde düşünün (hem değişkenler hem de yöntemler için geçerlidir):

private - > her yerden erişilebilir

default - >yalnızca ilan edildiği sınıfta erişilebilir

Şimdi karışıklık protected ve default'a gelince ortaya çıkıyor

protected - > Erişim değiştirici anahtar kelime yok. Bu, kesinlikle sınıfın paketi içinde mevcut olduğu anlamına gelir. Bu paketin dışında hiçbir yerde erişilebilir.

default - >

Outside world -> Package (SecurityEntryClass ---> Package private classes)
'dan biraz daha az katıdır ve aynı paket sınıfları dışında, paketi dışındaki alt sınıflar tarafından erişilebilir olduğu bildirilir.     
4
2017-06-27 02: 38: 18Z

Hepsi kapsülleme ile ilgilidir (veya Joe Phillips'in dediği gibi, en az bilgi ).

En kısıtlayıcı (özel) ile başlayın ve daha sonra daha az kısıtlayıcı değiştiricilere ihtiyacınız olup olmadığını görün.

Hepimiz özel, genel, ... gibi yöntem ve üye değiştiricileri kullanırız ... ancak çok az geliştiricinin yaptığı bir şey, kodları mantıksal olarak düzenlemek için paketleri kullanmaktır.

Örneğin: Hassas güvenlik yöntemlerini 'güvenlik' paketine koyabilirsiniz. Ardından, bu paketteki güvenlikle ilgili bazı kodlara erişen, ancak diğer güvenlik sınıflarını paketi gizli tutan bir genel sınıf koyun. Böylece diğer geliştiriciler, halka açık olan sınıfı sadece bu paketin dışından kullanabilecekler (değiştiriciyi değiştirmedilerse). Bu bir güvenlik özelliği değildir, ancak kullanımı yönlendirir .

 

Başka bir şey, birbirine çok bağımlı olan sınıfların aynı pakete girebileceği ve bağımlılık çok güçlüyse sonuçta yeniden birleştirilebileceği veya birleştirilebileceğidir.

Aksine, her şeyi genel olarak belirlerseniz, neye erişilmesi veya erişilmemesi gerektiği açık değildir; bu, bir çok javadoc (derleyici aracılığıyla hiçbir şey zorlamayan) yazmaya yol açabilir ...).

    
2
2018-07-31 11: 27: 23Z
kaynak yerleştirildi İşte