2012-01-31 60 views
9

Trong Java, tôi có thể truy cập một thành viên công khai của một lớp bằng cách sử dụng . như có thể thấy trong dòng thứ hai của phương thức chính trong ví dụ sau (vì lợi ích của ví dụ này, bỏ qua việc sử dụng gói gọn của tôi).Là '.' để truy cập thành viên được coi là một toán tử trong Java?

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

. coi là một nhà điều hành trong các ngôn ngữ lập trình Java, giống như *, ~, và != được coi là nhà khai thác?


Sửa - Mở rộng ví dụ trên:

Như đã chỉ ra, có vẻ như rằng đặc tả ngôn ngữ Java coi . là một dấu phân cách và không phải là một nhà điều hành. Tuy nhiên, tôi muốn chỉ ra rằng . trưng bày một số hành vi mà dường như là nhà điều hành-ish. Hãy xem xét ví dụ trên được mở rộng cho những điều sau:

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

Rõ ràng là một số quyền ưu tiên đang được thực thi để quyền truy cập thành viên được đánh giá trước khi bổ sung. Điều này có vẻ trực quan bởi vì nếu phần bổ sung được đánh giá đầu tiên, thì chúng ta sẽ có p.2 là vô nghĩa. Tuy nhiên, rõ ràng là . đang trưng bày hành vi mà các máy tách khác không làm.

+0

Cân nhắc bỏ qua cú pháp "này". Đó là thực hành xấu trong thế giới java, siêu mặt khác là alright khi bạn mở rộng các lớp học. – Tom

+3

@Tom Nếu tôi loại bỏ việc sử dụng 'this' trong ví dụ của tôi, thì các trường công khai của tôi sẽ không được khởi tạo và tôi sẽ gặp lỗi thời gian chạy. Ngoài ra, đó không phải là đặc biệt relavent cho câu hỏi của tôi. – jbranchaud

+3

@Tom Ý kiến ​​của bạn có thể, nhưng hầu như không phải là một quy tắc chung. Cá nhân tôi thấy việc sử dụng điều này ở những người định cư và xây dựng cao hơn nhiều so với việc phát minh ra một số tên mới cho các tham số để tôi có thể phân biệt chúng và các trường. – Voo

Trả lời

15

Nó được coi là một dấu tách , không phải là nhà điều hành . Xem Java Language Specification sections 3.11 and 3.12 để biết danh sách tất cả các dấu phân tách và toán tử.

+0

Tôi vẫn còn một số sự không chắc chắn. Trong bối cảnh của một đôi (ví dụ: '1.1'), nó có vẻ giống như một dấu tách, nhưng nó có vẻ là nhiều hơn một toán tử trong bối cảnh truy cập thành viên. – jbranchaud

+0

@Treebranch - Trong cuộc thảo luận về [kiểm soát truy cập] (http://java.sun.com/docs/books/jls/third_edition/html/names.html#104285), JLS mô tả _qualified names_: "a". "mã thông báo xuất hiện, trước một số dấu hiệu của gói, loại hoặc biểu thức có loại và tiếp theo là Mã định danh có tên là thành viên của gói hoặc loại". Vì vậy, có một "mã thông báo" và giống như dấu chấm câu (tức là dấu tách) so với toán tử. Trong mọi trường hợp, phân loại chính xác của "." token không quan trọng bằng Java như trong C++, bởi vì Java không cho phép các toán tử ghi đè. –

+0

Nó có ý nghĩa khi đặt như thế, cảm ơn cho lời giải thích! – jbranchaud

Các vấn đề liên quan