Yanıtlar:
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.
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.
/* pp */
) yalnızca varsayılan erişim için uygun bir addır . JLS adı değil.
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.
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
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 )
Ç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, new
doğ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.
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
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.
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ı.
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
JAVA'da, yalnızca o paket içinde o varlığın doğrudan örnek oluşturmasına izin veren "varsayılan" adlı bir erişim değiştiricisi vardır.
İşte yararlı bir bağlantı:
Ö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.