Java'daki varsayılan erişim belirteci nedir?


108

Bir Java kitabı okumaya başladım ve merak ettim; hiçbiri belirtilmediyse, varsayılan erişim tanımlayıcısı hangisidir?


Doğru terim 'erişim değiştirici'dir. 'Tanımlayıcı' kelimesi JLS'de görünmez.
Marquis of Lorne

Yanıtlar:


116

Varsayılan görünürlük "paket-özel" olarak bilinir (bunu açıkça kullanamazsınız), bu da alana sınıfın ait olduğu aynı paketin içinden erişilebileceği anlamına gelir.

Mdma'nın da işaret ettiği gibi, bu, varsayılanın "public" olduğu arayüz üyeleri için doğru değildir.

Java'nın Erişim Tanımlayıcılarına Bakın


25
yanlış - arayüz üyeleri için doğru değil. varsayılan erişim daha sonra herkese açıktır
mdma

2
Aslında 'özel paket' olarak bilinir. Üçüncü taraf web siteleri normatif referanslar değildir. Yalnızca JLS'den alıntı yapmalısınız.
Marquis of Lorne

81

Varsayılan belirtici bağlama bağlıdır.

Sınıflar ve arabirim bildirimleri için varsayılan paket özeldir. Bu, korumalı ve özel arasında yer alır ve yalnızca aynı paket erişimindeki sınıflara izin verir. (korumalı böyledir, ancak paketin dışındaki alt sınıflara da erişime izin verir.)

class MyClass   // package private
{
   int field;    // package private field

   void calc() {  // package private method

   }
}

Arayüz üyeleri (alanlar ve yöntemler) için varsayılan erişim geneldir. Ancak arabirim bildiriminin kendisinin varsayılan olarak özel paket olduğunu unutmayın.

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

O zaman beyannameyi alırsak

public interface MyInterface2 extends MyInterface
{

}

MyInterface2 kullanan sınıflar, MyInterface'in kendisinin bildirimini göremeseler bile genel olduklarından, alan1 ve yöntem1'i süper arayüzden görebilirler.


1
"Paket özel" (bazen kaynakta olarak yazılır /* pp */) yalnızca varsayılan erişim için uygun bir addır . JLS adı değil.
Tom Hawtin - tackline

10
@Tom - bu doğru, JLS "varsayılan erişim" kullanıyor. "Varsayılan, varsayılan erişimdir" yazabilirdim. Ama bu pek yardımcı olmadı!
mdma

16

Erişim belirteci belirtilmezse, sınıflar ve sınıf üyeleri için paket düzeyinde erişimdir (bunun için açık bir belirteç yoktur). Arayüz yöntemleri dolaylı olarak geneldir.


9

Varsayılan görünürlük (anahtar sözcük yok) pakettir , yani aynı pakette bulunan her sınıf için kullanılabilir olacaktır.

İlginç tarafı not olmasıdır korumalı aynı paket içinde diğer sınıfların alt sınıfları değil, aynı zamanda görünürlük sınırlamaz


8

O şeyin ne olduğuna bağlı.

  • Üst düzey türler (başka bir tür içinde bildirilmeyen sınıflar, numaralandırmalar, arabirimler ve ek açıklama türleri) varsayılan olarak özel pakettir . ( JLS §6.6.1 )

  • Sınıflarda, tüm üyeler (bu alanlar, yöntemler ve iç içe geçmiş tür bildirimleri anlamına gelir) ve yapıcılar varsayılan olarak özel pakettir . ( JLS §6.6.1 )

    • Bir sınıf hayır açıkça yapıcısı ilan etti, derleyici sahip bir varsayılan sıfır argüman yapıcı ekler sınıfla aynı erişim belirteci . ( JLS §8.8.9 ) Varsayılan kurucu, her zaman herkese açık olduğu için genellikle yanlış beyan edilir, ancak nadir durumlarda bu eşdeğer değildir.
  • Çeteleler olarak, kurucular özel varsayılan olarak. Aslında, sıralama müteahhitlerinin özel olması gerekir ve bunları genel veya korumalı olarak belirtmek bir hatadır. Numaralandırma sabitleri her zaman kamu ve herhangi bir giriş belirtici izin vermez. Numaralamanın diğer üyeleri varsayılan olarak özel pakettir . ( JLS §8.9 )

  • Arayüzleri ve ek açıklama türü, tüm üyeleri de (yine araçlar alanları, yöntemleri ve iç içe türü bildirimleri o) olan kamu varsayılan olarak. Aslında, arabirimlerin ve ek açıklama türlerinin üyeleri genel olmalıdır ve bunları özel veya korumalı olarak belirtmek bir hatadır. ( JLS §9.3 ila 9.5 )

  • Yerel sınıflar, bir yöntem, yapıcı veya başlatıcı bloğu içinde bildirilen adlandırılmış sınıflardır. Bunlar, bildirildikleri .. bloğunu kapsarlar{} ve herhangi bir erişim belirticisine izin vermezler. ( JLS §14.3 ) Yansımayı kullanarak, yerel sınıfları başka bir yerden başlatabilirsiniz ve bunlar pakete özeldir , ancak bu ayrıntının JLS'de olup olmadığından emin değilim.

  • Anonim sınıflar, newdoğrudan ifadede bir sınıf gövdesini belirten özel sınıflardır . ( JLS §15.9.5 ) Sözdizimleri herhangi bir erişim belirticisine izin vermiyor. Yansıma kullanarak, anonim sınıfları başka bir yerden başlatabilirsiniz ve hem onlar hem de oluşturucuları pakete özeldir , ancak bu detayın JLS'de olup olmadığından emin değilim.

  • Örnek ve statik başlatıcı bloklarının dil düzeyinde ( JLS §8.6 ve 8.7 ) erişim tanımlayıcıları yoktur , ancak statik başlatıcı blokları <clinit>( JVMS §2.9 ) adında bir yöntem olarak uygulanır , bu nedenle yöntemin dahili olarak bazı erişim tanımlayıcılara sahip olması gerekir. Bir hex editörü kullanarak javac ve Eclipse'in derleyicisi tarafından derlenen sınıfları inceledim ve her ikisinin de yöntemi özel paket olarak ürettiğini gördüm . Ancak, çağrı yapamazsınız <clinit>()çünkü dilin içinde <ve >karakterler bir yöntem adı geçersizdir ve yansıma yöntemleri varlığını inkar bagli kalarak bu yüzden etkili bir şekilde erişim belirteci olduğunu erişim yok . Yöntem, sınıf başlatma sırasında yalnızca VM tarafından çağrılabilir.Örnek başlatıcı blokları ayrı yöntemler olarak derlenmez; kodları her kurucuya kopyalanır, böylece yansıma yoluyla bile tek tek erişilemezler.


7

default , yöntemler ve değişkenler için erişim değiştirici olarak kullanılan bir anahtar sözcüktür.
Bu erişim değiştiriciyi kullanmak, sınıfınızı, değişkeninizi, yönteminizi veya kurucunuzu kendi sınıfından veya paketinden erişilebilir hale getirecek, ayrıca erişim değiştiricisi yoksa ayarlanacaktır.

  Access Levels
    Modifier    Class   Package Subclass  EveryWhere
    public        Y        Y       Y         Y
    protected     Y        Y       Y         N
    default       Y        Y       N         N
    private       Y        N       N         N

Bir arayüzde bir varsayılan kullanırsanız, bu örnekte olduğu gibi bir yöntem uygulayabilirsiniz.

public interface Computer {    
    default void Start() {
        throw new UnsupportedOperationException("Error");
    }    
}

Ancak yalnızca 8 Java sürümünden itibaren çalışacaktır

Resmi Belgeler

Java'da Erişim Değiştiriciler


3

Daha fazla ayrıntı için buraya bakın. Varsayılan, özel / genel / korumalı değildir, ancak tamamen farklı bir erişim belirtimidir. Yaygın olarak kullanılmıyor ve erişim tanımlarımda çok daha spesifik olmayı tercih ediyorum.


3

varsayılan erişim belirteci pakettir. Sınıflar aynı paketteki diğer sınıfların üyelerine erişebilir ancak paketin dışında özel olarak görünür


3

Java'nın yaratıcısı James Gosling ile yapılan bir röportajdan paket düzeyinde görünürlük hakkında bir alıntı:

Bill Venners : Java'nın dört erişim seviyesi vardır. Varsayılan pakettir. Paket erişimini varsayılan yapmanın uygun olup olmadığını hep merak etmişimdir, çünkü C ++ 'dan insanların zaten bildiği üç anahtar sözcük özel, korumalı ve geneldi. Ya da paket erişiminin varsayılan değer olması gerektiğini düşünmeniz için belirli bir nedeniniz varsa.

James Gosling : Bir paket genellikle birlikte yazılmış bir dizi şeydir. Yani genel olarak iki şeyden birini yapabilirdim. Biri sizi her zaman size alan adını veren bir anahtar kelime girmeye zorladı. Ya da varsayılan bir değerim olabilirdi. Ve sonra soru şu, mantıklı bir varsayılanı kılan nedir? Ve en az tehlikeli olanı seçmeye meyilliyim.

Yani kamuoyu, varsayılanı yapmak gerçekten kötü bir şey olurdu. Kişiler aslında özel yöntemleri bu kadar sık ​​yazmadıkları için, özel bir varsayılan yapmak muhtemelen kötü bir şey olurdu. Ve korumalı ile aynı şey. Ve sahip olduğum bir grup koda bakarken, makul ölçüde güvenli olan en yaygın şeyin paketin içinde olduğuna karar verdim. Ve C ++ bunun için bir anahtar kelimeye sahip değildi çünkü bir paket kavramları yoktu.

Ama arkadaş fikrinden çok hoşuma gitti, çünkü arkadaşlarınla ​​birlikte tüm arkadaşlarının kim olduğunu saymak zorundasın ve bu yüzden bir pakete yeni bir sınıf eklersen, o zaman genellikle hepsine gitmek zorunda kalırsın. O paketteki sınıfları ve arkadaşlarını her zaman tam bir baş ağrısı olarak bulduğum arkadaşlarını güncelliyor.

Ancak arkadaş listesinin kendisi bir çeşit sürüm sorununa neden olur. Ve böylece bir dost sınıf nosyonu vardı. Ve bunu varsayılan olarak yaptığım güzel şey - sorunu çözeceğim, o halde anahtar kelime ne olmalı?

Bir süredir aslında dostça bir anahtar kelime vardı. Ama diğerleri "P" ile başladığından, "PH" ile "arkadaşça" idi. Ama bu belki bir günlüğüne oradaydı.

http://www.artima.com/intv/gosling2P.html


2

Anahtar kelimenin Java 8 kullanımını güncelleyin default: Diğerlerinin de belirttiği gibi Varsayılan görünürlük (anahtar kelime yok)

alan, sınıfın ait olduğu aynı paketin içinden erişilebilir olacaktır.

Yeni Java 8 özelliği ( Varsayılan Yöntemler ) ile karıştırılmaması gereken, bir arayüzün,default anahtar kelimeyle .

Görmek: Erişim değiştiriciler



-2

Öncelikle, java'da "Erişim belirleyici" diye bir terim olmadığını söyleyeyim. Her şeyi "Değiştiriciler" olarak adlandırmalıyız. Son, statik, senkronize, uçucu .... 'nin değiştiriciler olarak adlandırıldığını bildiğimiz gibi, Genel, özel, korumalı, varsayılan, soyut da değiştiriciler olarak adlandırılmalıdır. Varsayılan, fiziksel varlığın olmadığı ancak değiştiricilerin yerleştirildiği bir değiştiricidir, bu durumda varsayılan değiştiriciler olarak ele alınmalıdır.

Bunu haklı çıkarmak için bir örnek alın:

public class Simple{  
    public static void main(String args[]){  
     System.out.println("Hello Java");  
    }  
}  

Çıktı şu şekilde olacaktır: Hello Java

Şimdi public'i özel olarak değiştirin ve hangi derleyici hatasını aldığınızı görün: "Özel değiştiriciye burada izin verilmez" diyor Birisi yanlış olabilir veya bazı öğreticiler yanlış olabilir, ancak derleyici yanlış olamaz. Yani javada terim erişim tanımlayıcısı olmadığını söyleyebiliriz, her şey değiştiricilerdir.


İlk cümle belirgindir, ancak bir dış sınıfın özel olamayacağı gerçeği, Java'da erişim belirteci diye bir şeyin olmadığını kanıtlamaz.
Marquis of Lorne

@EJP Bu sadece bir örnek. Demek istediğim, erişim belirteci terimi c, nokta net vb. Gibi diğer dillerde kullanılıyor, ancak bunun için java'daki teknik terim değiştiriciler. Tutulma veya başka bir IDE kullanırsanız, yeni sınıf oluştururken bizden değiştiricilerin adını vermemizin istendiğini ve listede bunların genel, özel, soyut vb.
Sunduğunu görebilirsiniz

Örneğimde derleyicinin hata mesajı verdiğini söylemeye çalıştığım şey: özel değiştiricilere izin verilmiyor, özel erişim belirleyicisine izin verilmiyor gibi mesaj vermiyor. Bu yüzden söylememiz gereken teknik terim, javadaki değiştiricilerdir,
java'daki tanımlayıcıya erişmez
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.