2012-01-31 18 views
9

Java'da, aşağıdaki örnekte ana yöntemin ikinci satırında görülebileceği gibi . kullanarak bir sınıfın genel üyesine erişebilirim (bu örnek için, kapsülleme konusundaki zayıf kullanımımı görmezden geliyorum).'.' üye erişim için Java'da bir operatör olarak kabul edildi?

public class Test { 
    public static void main(String[] args) { 
     Position p = new Position(0,0); 
     int a = p.x; // example of member access 
    } 
} 

class Position { 
    public int x; 
    public int y; 

    public Position(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

. sadece *, ~ ve != olarak kabul edilmektedir, Java programlama dilinde bir operatör olarak kabul operatörler mı?


Düzenleme - Yukarıdaki örnekte genişletme: işaret edildiği gibi

, Java dili spesifikasyonu bir ayırıcı değil bir operatör olmayı . gördüğü anlaşılıyor. Yine de, .'un operatör-ish gibi görünen bazı davranışlar sergilediğini belirtmek isterim. aşağıdakine uzatılmış yukarıdaki örneği ele alalım:

public class Test { 
    public static void main(String[] args) { 
     Position p = new Position(0,0); 
     int a = p . x; // a -> 0 
     int x = 1; 
     int b = p . x + x; // b -> 1 
    } 
} 

class Position { 
    public int x; 
    public int y; 

    public Position(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

Bazı öncelik elemanı ile erişim eklenmeden önce değerlendirilir şekilde uygulandığına açıktır. Bu sezgisel gibi gözüküyor, çünkü eğer ek ilk önce değerlendirilecekse, o zaman saçmalık olan p.2 olurdu. Yine de, .'un diğer ayırıcıların yapmadığı davranış sergilediği açıktır.

+0

"Bu" sözdizimini dışarıda bırakmayı düşünün. Bu java dünyasında kötü bir uygulama, diğer taraftan süper sınıfları genişletirken tamamdır. – Tom

+3

@Tom Örneğimde bu ''nin' 'kullanımlarından kurtulmuş olsaydım, o zaman benim kamusal alanlarım örneklenemezdi ve bir çalışma zamanı hatası olurdu. Ayrıca, bu özellikle benim soruma cevap vermiyor. – jbranchaud

+3

@ Tom Görüşün belki, ama neredeyse genel bir kural. Bunları şahsen, bunları ve alanları ayırt edebilmem için parametreler için bazı yeni isimler icat etmekten çok daha üstündür. – Voo

cevap

15

Bir ayırıcı değil, bir operatör kabul edilir. Tüm ayırıcıların ve işleçlerin bir listesi için Java Language Specification sections 3.11 and 3.12'a bakın.

+0

Hala belirsizliklerim var. Bir çifte bağlamında (ör., 1.1'), bir ayırıcı gibi görünüyor, ancak üye erişimi bağlamında bir operatörden daha fazlası gibi görünüyor. – jbranchaud

+0

@Treebranch - [Erişim kontrolü] konusundaki tartışmada (http://java.sun.com/docs/books/jls/third_edition/html/names.html#104285), JLS _qualified names_: "a" ifadesini açıklar. "belirteci, bir paketin türünü veya türünü içeren bir paketin veya bir paketin veya türün bir üyesini adlandıran bir Tanımlayıcı tarafından takip edilen bazı belirtilerden önce gelir." Yani orada bir "belirteci" ve daha fazla noktalama işareti (yani, ayırıcı) bir operatörden daha fazla. Her halükarda, "." Nin tam sınıflandırması Java, C++ 'da olduğu kadar önemli değildir, çünkü Java operatörün geçersiz kılmalarına izin vermez. –

+0

Bu şekilde koyarken mantıklı, açıklama için teşekkürler! – jbranchaud

İlgili konular