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


Alınan cevaba git


Java'da, yani varsayılan (özel paket), erişim değiştiricileri her ne zaman kullanılacağı hakkında net kurallar vardır public , protected ve private yaparken, class ve interface ve miras ile ilgili?


2965





2008-10-18




Cevap sayısını say: 27






Resmi öğretici sizin için biraz yararlanabilir.

______________________________________________________________
| │ Sınıf │ Paket │ Alt Sınıf │ Alt Sınıf │ Dünya |
| │ │ │ (aynı pkg) │ (fark pkg) │ |
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| public │ + │ + │ + │ + │ + | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| korumalı │ + │ + │ + │ + │ | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| değiştirici yok│ + │ + │ + │ │ | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| özel │ + │ │ │ │ |
| ___________ | _______ | _________ | __________ | __________ | ________ |
 +: erişilebilir boş: erişilebilir değil

5367


2008-10-18





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

Özel

Düşündüğünüz gibi, sadece ilan edildiği sınıfı görebilir.

Özel paket

Sadece bildirildiği paket tarafından görülebilir ve kullanılabilir . Java’da varsayılan ayardır (bazıları hata olarak görür).

korumalı

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

halka açık

Herkes görebilir.

Yayınlanan

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

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

Neyi ne zaman 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.

Bu yüzden, kurallara uymak, işleri sadece 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ı kamuoyuna açıklayın, kamuoyuna verdiğiniz her ayrıntı sistemi yeniden tasarlama yeteneğinizi kısıtlar.

Kullanıcıların davranışları ö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ün dışında kalır ve kullanım bulmak için başkalarının koduna bakmanız gerekir.

“Yayımlanmış” fikrinin geldiği yer burasıdır. Bir arayüzün değiştirilmesi (yeniden düzenlenmesi), onu kullanan tüm kodu bulmanızı ve onu 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 bulmuyor. Bu amaçla, bir özellik sınıfı kavramı var , ama bu başka bir gösteri.


442


2008-10-18





İş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 ( i ) 'dir sadece o ilan edilir aynı sınıfta içinde erişilebilir.

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

  • Bir korunmuş elemanı ( k ) aynı paket içinde tüm sınıfları içinde erişilebilir ve diğer paketlerde alt sınıflar içindeki.

  • Bir genel üyeye ( l ) tüm sınıflar için erişilebilir ( bildirildiği paketi dışa aktarmayan bir modülde bulunmuyorsa).


Hangi değiştiriciyi seçmeliyim?

Erişim değiştiricileri yanlışlıkla kapsüllenmeyi (*) kırmamanızı önleyen bir araçtır . Üyeye sınıfa, pakete, sınıf hiyerarşisine dahil olan bir şey olup olmadığına karar verip vermediğinizi kendinize sorun ve buna göre erişim seviyesini seçin.

Örnekler:

  • Bir tarla long internalCounter değişken olduğundan ve bir uygulama detayından dolayı muhtemelen özel olmalıdır.
  • Sadece bir fabrika sınıfında (aynı pakette) başlatılması gereken bir sınıf, bir paket kısıtlı kurucusuna sahip olmalıdır, çünkü onu doğrudan paket dışından çağırmak mümkün olmamalıdır.
  • Oluşturulmadan void beforeRender() hemen önce çağrılan ve alt sınıflarda kanca olarak kullanılan dahili bir yöntem korunmalıdır.
  • void saveGame(File dst) GUI kodundan çağrılan bir yöntem ortak olmalıdır.

(*) Kapsülleme tam olarak nedir?


385


2015-11-10





                 | 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         |       ✔       |     ✘    |       ✘       |   ✘    
____________________________________________________________________
 

190


2013-01-09





Kolay kural Her şeyi özel olarak ilan etmeye başlayın. Ve ihtiyaçlar ortaya çıktığında ve tasarım bunu garanti ettikçe halka doğru ilerleyin.

Üyeleri teşhir ederken, temsil tercihlerini mi yoksa soyutlama seçimlerini mi bıraktığını sor. Birincisi, 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 yaparak 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 yansıtırken işlerin kırılmasını önlemek için geçersiz kılınırken @Override ek açıklamasını kullanın.


154


2008-10-18





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 özel paket olarak da adlandırılır . İstisna: Bir arayüzde, hiçbir değiştirici genel erişim anlamına gelmez; halk dışındaki değiştiriciler yasaktır. Enum sabitleri her zaman halka açıktır.

özet

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

  • Üye private : Sadece üye arama koduyla aynı sınıf içinde tanımlanmışsa.
  • Üye özel paket: Sadece arayan kod derhal üyeyi kapsayan paket içindeyse.
  • Üye protected : Aynı paket veya üye arama kodunu içeren sınıfın bir üst sınıfında 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 kapsamdaki sınıflar için yalnızca public ve özel paketlere izin verilir. Bu tasarım tercihi muhtemelen çünkü protected ve private paket düzeyinde gereksiz olurdu (paketlerin miras yoktur).

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

public en private az , en çok erişim sağlayan anlam . Ö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. (Aynı paketteki korumalı üyelere diğer sınıflara erişim verilmesi bir hata olarak kabul edildi.)

notlar

  • Bir sınıfın yöntemleri vardır aynı sınıfın diğer nesnelerin özel üyelerini erişmesine olanak tanıdı. Daha doğrusu, 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ıf tarafından erişimi kısıtlamayı desteklemez. (Kullanmayı destekleyen Scala ile karşılaştırın private[this] .)
  • Bir nesneyi inşa etmek için bir yapıcıya erişmeniz 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.
    • Sadece özel kuruculara sahip olmak aynı zamanda sınıfın dışarıdan 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, onu alt sınıflayan iç içe bir sınıf içerebilir.)

İç sınıflar

Ayrıca, iç sınıflar gibi iç içe kapsamları da göz önünde bulundurmalısınız . 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şıktır ve tüm ayrıntılar için Java Dil Belirtimi'ne bakın . (Evet, geçmişte derleyici hatalar vardı.)

Bunların nasıl etkileşime girdiğ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:

 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();
    }
}
 

Derleyici çıkışı:

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

Bazı ilgili sorular:


107


2012-09-13





Kural olarak:

  • private : sınıf kapsamı.
  • default (veya package-private ): paket kapsamı.
  • protected : package scope + child (paket gibi, ancak onu farklı paketlerden alt sınıflandırabiliriz). Korunan değiştirici daima "ebeveyn-çocuk" ilişkisini tutar.
  • public : her yerde.

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

  • (D) doğru (aynı sınıfın içindeki bir yöntemden veya "this" sözdizimi aracılığıyla çağır ).
  • (R) eference (sınıfa bir referans 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 tabloya sahibiz:

 +—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+
 

84


2012-12-18





Çok kısa

  • public : her yerden erişilebilir.
  • protected : aynı paketin sınıfları ve herhangi bir paketin içinde bulunan alt sınıflar tarafından erişilebilir.
  • varsayılan (belirtici yok): aynı paketin sınıfları tarafından erişilebilir.
  • private : sadece aynı sınıf içerisinde erişilebilir.

49


2012-10-27





Java’daki en yanlış anlaşılan erişim değiştiricisi protected . 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; Father ve Son , her birinin kendi paketindeki:

     package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
     
  • En protected yöntem ekleyelim foo() için Father .

     package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
     
  • Yöntem foo() 4 bağlamda çağrılabilir:

    1. Aynı pakette bulunan bir sınıfın içinde foo() ( fatherpackage ) tanımlanmıştır :

       package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
       
    2. Bir alt sınıfın içinde, mevcut örnekte this veya yoluyla super :

       package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
       
    3. Türü aynı sınıf olan bir referansta:

       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();
          }
      }
       
    4. Türü ana sınıfı olan ve tanımlı paketin içinde olduğu bir referansta foo() ( fatherpackage ) [Bu, bağlam no. 1]:

       package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
       
  • Aşağıdaki durumlar geçerli değil.

    1. Türü ana sınıf olan ve tanımlı ( ) paketinin dışında olan bir referansta : foo() fatherpackage

       package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
       
    2. Bir alt sınıf paketinin içindeki bir alt 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):

       package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
       

42


2013-11-15





Özel

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

Özel 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 Arayüz

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

Not

Özel olarak bildirilen değişkenlere, sınıfta genel alıcı yöntemleri varsa sınıfın dışında erişilebilir. 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ı

  • Sınıf ve Arayüz

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

Yöntemler, alanlar korumalı, ancak bir arabirimdeki yöntemler ve alanlar korumalı olarak ilan edilemez.

Not

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.


halka açık

Genel olarak ilan edilen bir sınıf, yöntem, yapıcı, arayüz vb. Başka bir sınıftan erişilebilir.

Bu nedenle, bir kamu sınıfı içerisinde ilan edilen 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 kalıtımı 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:

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

  • Aynı Paketlerde

Herhangi bir 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ılamayız. Eğer geçersiz kılmaya çalışırsanız, herhangi bir hata göstermez ancak neyin dışında çalışır.

İlgili Cevaplar

Referanslar bağlantıları

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


28


2014-01-22





Fark, daha önce verilen bağlantılarda bulunabilir, ancak hangisinin kullanılacağı genellikle "En Az Bilgi Prensibi" ne bağlıdır. Sadece gereken en düşük görünürlüke izin verin.


18


2008-10-18





Özel : Sadece sınıfa sınırlı erişim

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

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

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


18


2014-06-18





Erişim düzenleyicileri, erişimi çeşitli seviyelerde kısıtlamak için vardı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.

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

Korumalı: değişkenlere aynı paketteki ve diğer herhangi bir paketteki alt sınıflara erişebilirsiniz. temelde bu varsayılandır + Miras alınan davranış.

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

Özel: Aynı sınıfta erişim olabilir.

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


15


2014-12-17





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ıflara erişilebilir.

Örneğin,

 // 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
  }
}
 

Bu erişim halktan ve korunmadan daha kısıtlı, fakat özelden daha az kısıtlıdır.

2. Kamu

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

Ö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();
  }
}
 

Çıktı: Merhaba

3. Özel

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

Özel üyelere bir sınıftaki diğer üyelere erişmeye çalışırsanız derleme hatası atarsınız. Ö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
  }
}
 

4. Korumalı

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

Ö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();
  }
}
 

Çıktı: Merhaba


Resim tanımını buraya girin


14


2016-08-07





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 bulunmadığında) her zaman paket özel 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 açıklama türleri) varsayılan olarak paket-özeldir. ( 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 özeldir . (Gerçekten de, enum inşaatçıları özel olmalı ve onları halka açık ya da korumalı 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üzlerin 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





  • genel - uygulamanın herhangi bir yerinden erişilebilir.

  • varsayılan - paketten erişilebilir.

  • korumalı - başka bir pakette bulunan paket ve alt sınıflardan erişilebilir. yanı sıra

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


12


2015-08-29





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

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

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

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:

 String name = "john";

public int age(){
    return age;
}
 

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

Özel olarak ilan edilen metotlar, değişkenler ve kuruculara sadece ilan edilen sınıfın 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 bildirilen 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 class Details{

    private String name;

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

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

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

Genel ilan edilen bir sınıfa, metoda, yapıcıya, ara yüze vb. Diğer sınıflardan erişilebilir. Bu nedenle, bir kamu 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 kalıtımı 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:

 public void cal(){

}
 

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 arayüzlere uygulanamaz. Yöntemler, alanlar korumalı, ancak bir arabirimdeki yöntemler ve alanlar korumalı olarak ilan edilemez.

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.

 class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}
 

12


2015-05-26





Bu sayfa korumalı ve varsayılan erişim değiştiricisi hakkında iyi yazıyor

.... 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, üyeliğin ilan edildiği sınıfın, alt sınıfın bulunduğu paketin dışındaki alt sınıfları için erişilebilir olmasıdır.

Ancak bu korunan üyelere “paket dışında yalnızca miras yoluyla erişilebilir”. yani, bir sınıfın korumalı bir üyesine, başka bir pakette mevcut olan alt sınıfındaki üyeye, alt sınıfın kendisinde mevcut gibi erişebilirsiniz. Ancak bu korumalı üyeye, üst sınıfın referansı kullanılarak paketin dışındaki alt sınıfta erişilemez. ....


11


2012-03-15





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ın 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.


9


2008-10-19





Not: Bu sadece kabul edilen cevap için bir ekidir .

Bu, Java Access Değiştiricileri ile ilgilidir .

Gönderen Java Erişim Modifikörleri :

Bir Java erişim değiştiricisi, hangi sınıfların belirli bir sınıfa ve alanlarına, yapıcılarına ve yöntemlerine erişebileceğini belirler. Erişim düzenleyicileri bir sınıf, yapıcıları, alanları ve yöntemleri için ayrı ayrı belirtilebilir. Java erişim değiştiricileri bazen günlük konuşmalarda Java erişim belirticileri olarak da adlandırılır, ancak doğru ad Java erişim değiştiricileridir. Sınıflar, alanlar, yapıcılar ve yöntemler, dört farklı Java erişim düzenleyicisinden birine sahip olabilir:

  • Liste öğesi
  • özel
  • varsayılan (paket)
  • korumalı
  • halka açık

Gönderen Sınıf Üyelerine Kontrol Erişim öğreticiler:

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

  • Ü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 bu 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, ayrıca özel paket olarak da bilinir), yalnızca kendi paketinde görünür

Aşağıdaki tabloda, her değiştirici tarafından izin verilen üyelere erişim gösterilmektedir.

 ╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ 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     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝
 

İlk veri sütunu, sınıfın kendisinin erişim seviyesi tarafından tanımlanan üyeye erişimi olup olmadığını gösterir. Gördüğünüz gibi, bir sınıf her zaman kendi üyelerine erişebilir. İkinci sütun, sınıfla aynı paketteki sınıfların (eşliklerine bakılmaksızın) üyeye erişimi olup olmadığını gösterir. Üçüncü sütun, bu paketin dışında ilan edilen sınıfın alt sınıflarının üyeye erişimi olup olmadığını gösterir. Dördüncü sütun, tüm sınıfların üyeye erişimi olup olmadığını gösterir.

Erişim seviyeleri sizi iki şekilde etkiler. Öncelikle, Java platformundaki sınıflar gibi başka bir kaynaktan gelen sınıfları kullandığınızda, erişim düzeyleri kendi sınıflarınızın hangi sınıf üyelerini kullanabileceğini belirler. İkincisi, bir sınıf yazdığınızda, her üye değişkenin ve sınıfınızdaki her yöntemin hangi erişim seviyesine sahip olduğuna karar vermeniz gerekir.


6







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 genel veya varsayılan olabilir
  2. Sınıf üyeleri genel, korumalı, varsayılan veya özel olabilir.

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

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


5


2014-07-30





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

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

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

  • Sonra, arkadaşını yurtına götürmek istiyorsun, ama bunun için onu ziyaretçi olarak kaydetmen 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ı KORUMALI olarak yapar .

  • Arkadaşınız kampüsün WiFi'sine 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 yapar .

  • 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 ÖZEL olarak yapar .

Bu yardımcı olur umarım!


5


2017-04-06





Eğer erişim değiştiricileri düşünüyorsun zaman sadece bu şekilde (her ikisi için de geçerlidir de düşünmek değişkenler ve yöntemlerle ):

public -> her yerden
private erişilebilir -> sadece ilan edildiği sınıfta erişilebilir

Şimdi karışıklık söz konusu olduğunda ortaya çıkar default ve protected

default -> 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 yere erişilebilir.

protected -> Biraz daha sıkı daha default ve dışında dışarıda alt sınıflar tarafından erişilebilir aynı paket sınıflardan paketin o bildirildi.


4


2017-06-27





Her şey 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 ... ama çok az geliştiricinin yaptığı bir şey kodu mantıksal olarak düzenlemek için paketleri kullanmaktır .

Örneğin: Hassas güvenlik yöntemlerini bir 'güvenlik' paketine koyabilirsiniz. Ardından, bu paketteki güvenlikle ilgili bazı kodlara erişen ancak diğer güvenlik sınıfları paketini özel 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 kılavuz kullanımını.

 Outside world -> Package (SecurityEntryClass ---> Package private classes)
 

Başka bir şey, birbirine çok bağımlı olan sınıfların aynı pakete girebileceği ve bağımlılığın çok güçlü olması halinde eninde sonunda yeniden birleştirilebileceği veya birleştirilebileceğidir.

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


2


2018-02-14





Benim iki Sentim :)

özel:

sınıf -> bir üst seviye sınıf özel olamaz. aynı sınıftan erişilebilen iç sınıflar özel olabilir.

örnek değişkeni -> yalnızca sınıfta erişilebilir. Sınıf dışına erişilemiyor.

paketlemek-özel:

sınıf -> bir üst seviye sınıf özel paket olabilir. Sadece aynı paketten erişilebilir. Alt paketten değil, dış paketten değil.

örnek değişkeni -> aynı paketten erişilebilir. Alt paketten değil, dış paketten değil.

korunmuş:

sınıf -> bir üst seviye sınıf korunamaz.

örnek değişkeni -> Yalnızca aynı paket veya alt paketten erişilebilir. Sınıfı genişletirken yalnızca paketin dışına giriş yapılabilir.

halka açık:

sınıf -> paketten / alt paketten / başka bir paketten erişilebilir

örnek değişkeni -> paket / alt paket / başka bir paketten erişilebilir

İşte ayrıntılı cevap

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md


1


2019-10-16





  • halka açık

    Bir sınıf üyesine genel ilan edildiyse, o zaman herhangi bir yerden erişilebilir.

  • korumalı

    Bir sınıf üyesine anahtar kelime korumalı olarak bildirilirse, aynı sınıf üyelerinden, aynı paketteki sınıf üyelerinden ve miras kalan sınıf üyelerinden erişilebilir. Bir sınıf üyesi korunursa, dış paketlenmiş sınıfa miras alınmadığı sürece dış paket sınıfından erişilemez, yani diğer paket üst sınıfını uzatmaz. Ancak, korunan bir sınıf üyesi her zaman aynı paket sınıfları için kullanılabilir durumdadır, aynı paket sınıfının miras aldığı veya DEĞİL olduğu hava durumu farketmez

  • varsayılan

    Java'da varsayılan bir erişim değiştirici anahtar sözcüğü DEĞİLDİR. Bir sınıf üyesi, herhangi bir erişim değiştiricisi anahtar kelimesi olmadan bildirilirse, bu durumda, varsayılan üye olarak kabul edilir. Varsayılan sınıf üyesi her zaman aynı paket sınıfı üyeleri tarafından kullanılabilir. Ancak, dış sınıf sınıfları, korunan üyelerin aksine alt sınıflar olsa bile, varsayılan sınıf üyelerine erişemez.

  • özel

    Bir sınıf üyesi anahtar kelime korumalı olarak bildirilirse, bu durumda SADECE aynı sınıf üyeleri tarafından kullanılabilir.


0


2019-09-19






Özel korumalı-kamu-mükemmel-benzetme-için değişken veri tipleri

Blok diyagramıdır veri üyeleri açıklar sonra temel sınıf olan kalıtsal zaman türetilen sınıf erişim modu özel .


görüntü tanımını buraya girin

Not: Veri üyelerini özel erişim belirteci ile bildirmek, veri gizleme olarak bilinir .

Kaynak: Erişim Belirleyicileri - Özel, Kamu ve Korumalı


0


2019-09-20