2012-01-31 12 views
9

W Javie mogę uzyskać dostęp do publicznego elementu klasy, używając ., co można zobaczyć w drugim wierszu głównej metody w poniższym przykładzie (dla tego przykładu zignoruj ​​moje słabe użycie enkapsulacji).Czy "." dla dostępu członka uważany za operatora w Javie?

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

Czy . traktowany jako operator w języku programowania Java, tak jak *, ~ i != są uważane operatorom?


Edit - Rozszerzenie powyższego przykładu:

Jak już wspomniano, wydaje się, że specyfikacja języka Java uważa . być separator a nie operator. Chciałbym jednak zwrócić uwagę, że . wykazuje pewne zachowanie, które wydaje się raczej operatorem. Rozważ powyższy przykład przedłużony do:

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

Oczywiste jest, że niektóre pierwszeństwo jest egzekwowane tak, że dostęp członkiem jest oceniany przed dodaniem. Wydaje się to intuicyjne, ponieważ jeśli dodawanie miało być najpierw ocenione, wtedy mielibyśmy p.2, co jest nonsensem. Niemniej jednak jest oczywiste, że . wykazuje zachowanie, którego nie posiadają inne separatory.

+0

Rozważ pominięcie tej "składni". To jest zła praktyka w świecie java, super w drugiej strony jest w porządku, gdy rozszerzasz klasy. – Tom

+3

@ Tom Jeśli pozbyłem się zastosowań tego "w moim przykładzie", wówczas moje pola publiczne nie zostałyby utworzone i miałbym błąd w czasie wykonywania. Ponadto nie jest to szczególnie relavent na moje pytanie. – jbranchaud

+3

@Tom Twoja opinia może, ale nie jest to ogólna zasada. Osobiście uważam, że użycie tego w setterach i konstruktorach jest o wiele lepsze od wymyślania nowych nazw parametrów, dzięki czemu mogę je odróżnić od pól. – Voo

Odpowiedz

15

Jest uważany za separator , a nie operatora . Zobacz Java Language Specification sections 3.11 and 3.12 listę wszystkich separatorów i operatorów.

+0

Nadal mam trochę niepewności. W kontekście podwójnego (np. "1.1") wydaje się, że jest to separator, ale wydaje się być bardziej operatorem w kontekście dostępu członków. – jbranchaud

+0

@ Treebranch - W dyskusji na temat [kontrola dostępu] (http://java.sun.com/docs/books/jls/third_edition/html/names.html#104285) JLS opisuje _kwalifikowane names_: "a". "pojawia się token, poprzedzony pewnym oznaczeniem paczki, typu lub wyrażenia posiadającego typ, po którym następuje identyfikator identyfikujący członka paczki lub typu." Tak więc jest to "token" i bardziej przypomina interpunkcja (tj. Separator) niż operator. W każdym razie dokładna klasyfikacja "." token nie jest tak ważny w Javie, jak to jest na przykład w C++, ponieważ Java nie pozwala na nadpisywanie operatora. –

+0

To ma sens, gdy tak się stanie, dzięki za wyjaśnienie! – jbranchaud

Powiązane problemy