"Paket özel" üye erişimi, varsayılan (değiştiricisiz) erişimle eşanlamlı değil mi?


95

Bazı belgelerin kullandığı "özel paket" terimi ve "varsayılan erişim" kullanımı konusunda biraz kafam karıştı. Özel paket ve varsayılan erişim, korumalı ile eşanlamlı değil mi?


7
Öyleyse, paket özel erişimini ifade edecek herhangi bir anahtar kelime yok mu? Sadece erişim değiştiricinin belirtilmemesi ile mi ima ediliyor?
TurtleToes

5
TurtleToes, bu doğru ve bu Java 8'de biraz kafa karıştırıcı olabilir, çünkü defaultdeğiştiriciyi (arayüz) yöntemlerinin önüne koymak aslında mümkün . Ancak bu bir erişim değiştirici değildir! Tüm erişim değiştiriciler ve kapsamları bu tabloda açıkça görselleştirilmiştir .
aioobe

Yanıtlar:


137

Evet, neredeyse aynı. Korumalı değiştirici, üyeye yalnızca kendi paketi (özel paket ile olduğu gibi) ve ek olarak , başka bir paketteki sınıfının bir alt sınıfı tarafından erişilebileceğini belirtir .


Burada birçok iyi cevap vardı, ancak bu cevap basit ve
net

23
Arabirim üyesi için varsayılan erişimin pakete özel olmadığını belirtmek gerekir .
Peter Lawrey

1
@PeterLawrey Oh? O halde arabirim üyeleri için varsayılan erişim nedir?
ArtOfWarfare

8
Bir alan için varsayılan public static final, bir yöntem için public abstract, bir sıralama veya açıklama için publicve bir sınıf için budurpublic static
Peter Lawrey

36

"Varsayılan" erişim değiştiricisi (hiçbirinin açıkça verilmediği) "paket-özel" dir, bu da yalnızca aynı paketteki şeylerin bunlara erişebileceği anlamına gelir. Bununla birlikte, aynı pakette olmak, sınıflar arasındaki kalıtım ilişkisi hakkında hiçbir şey ifade etmez - bu tamamen bir adlandırma kuralı.

"Korumalı", yalnızca aynı paketteki sınıfların değil, aynı zamanda alt sınıfların da (bu alt sınıfların hangi paket içinde olduğuna bakılmaksızın) ona erişebileceği anlamına gelir.


peki, korumalı ifadeniz yanlış .. Aynı paket sınıf örnekleri de korumalı üyelere erişebilir ..
Gürsel Koca

15

Sınıflar için varsayılan erişim paket özeldir, ancak arabirim üyeleri için varsayılan erişim geneldir.

Örneğin

public interface I {
   int A = 1;
// same as
   public static final int A = 1;

   void method();
// same as
   public abstract void method();

   class C { }
// same as
   public static class C { }
}

Arayüzler için varsayılan erişim kuralları, sınıflar için olanlarla aynı değildir.


3

Paket özel ve varsayılan erişim eşanlamlıdır. Bir nesne, sınıfları aynı pakette bulunan nesnelerin korumalı üyelerine de erişebilir. Bir nesne, paketleriyle ilgili bir koşul olmaksızın üst sınıflarının korumalı üyelerine de erişebilir. Somut bir örnek olarak:

package ab;

class A {
   protected void foo() {}
   void dd(){}
}

class C {
   void aa(){
       A a = new A();
       a.foo(); //legal
       a.dd();  //legal
   }
}


package sub;

class D extends A{
      void ac(){
         foo(); //legal ..
         dd();  //illegal.. because dd has default access.. 
      }

class E {
    void ee(){
       A a = new A();
       a.foo(); //illegal
       a.dd();  //illegal     
    }

az seçmen bu açıklamanın yanlışını açıklayabilir mi? .. kötü üslup dışında ..
Gürsel Koca

6
Olumsuz oy veren ben değilim, ama sanırım bunun nedeni tam olarak doğru olmaması; bir nesne, paketten bağımsız olarak üst sınıfların korumalı üyelerine erişebilir .
Adrian Petrescu

1

'Paket özel' ve varsayılan erişim aynıdır. Derleyicinin 1.1.2 / 3 civarında ilk sürümlerinde, 'paket' izin verilen bir değiştiriciydi, ancak yok sayıldı, yani hiçbir değiştirici, yani 'özel paket' ile aynı anlama geliyordu. Kısa bir süre sonra /*package*/, bu tür durumlarda (yorum olarak) koymak için kısa ömürlü bir moda vardı . Benzer şekilde, aynı zamanda, eşzamanlı sınıflar gibi şeyleri bildirebilirdiniz, ancak yine de gerçek bir anlamsal etki olmamıştı.

Bunların hiçbiri, diğer paketlerdeki türetilmiş sınıflara uzanan 'korumalı' ile aynı değildir.


0

Gönderen Java Dili Spec

  • 6.6.5 Örnek: Varsayılan Erişim Alanları, Yöntemleri ve Oluşturucular Açık , korumalı veya özel erişim değiştiricilerinden hiçbiri belirtilmezse, sınıfın içinde bulunduğu sınıfın bildirimini içeren paket boyunca bir sınıf üyesi veya yapıcıya erişilebilir. üye bildirildi, ancak sınıf üyesi veya kurucu başka hiçbir pakette erişilebilir değil.

Bir public sınıfın varsayılan erişime sahip bir yöntemi veya kurucusu varsa, bu yöntem veya yapıcı, bu paket dışında bildirilen bir alt sınıf tarafından erişilebilir veya bu sınıf tarafından miras alınamaz.


2
Ama "özel paket" ne olacak? Bu JLS'de değil.
Tom Hawtin - tackline

-1

default ve package-private her ikisi de aynıdır, yani her ikisi de aynı pakette olana kadar herhangi bir sınıf tarafından kullanılabilir.

Paket-özel terim, aslında anlamı ile denir özel olarak değiştirici özel yalnızca aynı sınıfta mevcuttur ve başka hiçbir sınıflar veya alt sınıfların aynı paket içinde veya ihtiyaç duymadan erişebilmek vasıtası.

Bu nedenle özel paket , varsayılanla aynı anlamına gelir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.