2011-11-04 41 views
38

Nói chung, các thành viên tĩnh cuối cùng, các biến (hoặc cuối cùng tĩnh, chúng có thể được sử dụng theo thứ tự mà không chồng chéo ý nghĩa) được sử dụng rộng rãi với các giao diện trong Java để xác định một hành vi giao thức cho lớp triển khai ngụ ý rằng lớp thực hiện (kế thừa) một giao diện phải kết hợp tất cả các thành viên của giao diện đó.Sự khác nhau giữa biến tĩnh và biến tĩnh cuối cùng trong Java


Tôi không thể phân biệt giữa một thứcthức tĩnh thành viên. Thành viên tĩnh cuối cùng là một thành viên tĩnh được khai báo là final hay cái gì khác? Trong đó tình huống cụ thể nào nên được sử dụng cụ thể?


Biến tĩnh hoặc biến tĩnh cuối cùng không bao giờ có thể được khai báo bên trong phương thức không nằm trong phương pháp tĩnh hoặc bên trong phương pháp thể hiện. Tại sao?

Đoạn mã sau phù hợp, sẽ không được biên dịch và lỗi biên dịch sẽ do trình biên dịch phát hành, nếu có nỗ lực biên dịch nó.

public static void main(String args[]) 
{ 
    final int a=0; //ok 

    int b=1; //ok 

    static int c=2; //wrong 

    final static int x=0; //wrong 
} 
+7

trường 'tĩnh' chỉ có thể thuộc về một Lớp, do đó lỗi trình biên dịch. 'final' có nghĩa là một biến không bao giờ có thể thay đổi sau lần khởi tạo đầu tiên. – brc

+0

@EJP, ah, có lẽ tôi đã nhầm rồi. Đừng bận tâm! – bdonlan

+0

@bdonlan Trong các biến giao diện thực tế được đề cập cụ thể như là một mô hình chống trong Java hiệu quả. –

Trả lời

115

Bạn đang kết hợp rất nhiều khái niệm khác nhau. Ngay cả câu hỏi trong tiêu đề cũng không tương ứng với câu hỏi trong cơ thể.

Anyways, đây là những khái niệm bạn đang trộn lên:

  • biến
  • biến thức
  • lĩnh vực
  • lĩnh vực thức
  • lĩnh vực tĩnh
  • lĩnh vực static final

Từ khóa static chỉ có ý nghĩa đối với các trường, nhưng trong mã bạn cho thấy bạn đang cố gắng sử dụng nó trong một hàm, trong đó bạn không thể khai báo các trường (trường là thành viên của các lớp; các biến được khai báo trong các phương thức).

Hãy thử mô tả nhanh chúng.

  1. biến được khai báo trong phương pháp, và sử dụng như một số loại lưu trữ địa phương có thể thay đổi (int x; x = 5; x++) biến

  2. thức cũng được khai báo trong phương pháp, và được sử dụng như một bộ nhớ cục bộ không thay đổi (final int y; y = 0; y++; // won't compile). Chúng rất hữu ích để bắt lỗi, nơi ai đó sẽ cố gắng sửa đổi một cái gì đó mà không nên sửa đổi. Cá nhân tôi thực hiện hầu hết các biến địa phương và các tham số của phương thức final. Ngoài ra, chúng là cần thiết khi bạn tham khảo chúng từ các lớp bên trong, ẩn danh.Trong một số ngôn ngữ lập trình, loại biến duy nhất là biến không thay đổi (bằng các ngôn ngữ khác, loại biến "mặc định" là biến không thay đổi) - như một bài tập, cố gắng tìm ra cách viết một vòng lặp chạy số lần được chỉ định khi bạn không được phép thay đổi bất kỳ điều gì sau khi khởi tạo! (hãy thử, ví dụ: để giải quyết fizzbuzz chỉ với các biến cuối cùng!).

  3. lĩnh vực xác định nhà nước có thể thay đổi các đối tượng, và được khai báo trong lớp (class x { int myField; }).

  4. lĩnh vực thức xác định trạng thái bất biến của các đối tượng, được khai báo trong lớp học và phải được khởi tạo trước khi kết thúc xây dựng (class x { final int myField = 5; }). Chúng không thể sửa đổi được. Chúng rất hữu ích khi thực hiện đa luồng, vì chúng có các thuộc tính đặc biệt liên quan đến việc chia sẻ các đối tượng giữa các luồng (bạn được đảm bảo rằng mọi luồng sẽ thấy giá trị được khởi tạo đúng của trường cuối cùng của đối tượng, nếu đối tượng được chia sẻ sau khi hàm tạo đã hoàn thành, và ngay cả khi nó được chia sẻ với các cuộc đua dữ liệu). Nếu bạn muốn một bài tập khác, cố gắng giải quyết fizzbuzz lần nữa chỉ sử dụng các trường cuối cùng, và không có trường nào khác, không phải bất kỳ biến nào hay tham số phương thức (rõ ràng, bạn được phép khai báo tham số trong hàm tạo, nhưng đó là tất cả!).

  5. trường tĩnhđược chia sẻ giữa tất cả các phiên bản của bất kỳ lớp học nào. Bạn có thể coi chúng như một loại lưu trữ có thể thay đổi toàn cầu (class x { static int globalField = 5; }). Ví dụ nhỏ nhất (thường là vô dụng) là đếm các đối tượng của một đối tượng (ví dụ: class x { static int count = 0; x() { count++; } }, tại đây hàm tạo tăng số đếm mỗi khi nó được gọi, tức là mỗi lần bạn tạo một thể hiện là x với new x()). Cẩn thận rằng, không giống như các lĩnh vực cuối cùng, họ không vốn an toàn chủ đề; nói cách khác, bạn chắc chắn sẽ nhận được một số sai các trường hợp của x với mã ở trên nếu bạn đang instantiating từ chủ đề khác nhau; để làm cho nó chính xác, bạn phải thêm một số cơ chế đồng bộ hóa hoặc sử dụng một số lớp chuyên biệt cho mục đích này, nhưng đó là một câu hỏi khác (thực ra, nó có thể là chủ đề của toàn bộ cuốn sách).

  6. lĩnh vực static finalhằng toàn cầu (class MyConstants { public static final double PI = 3.1415926535897932384626433; }).

Có rất nhiều đặc điểm tinh tế khác (như: trình biên dịch có thể tự do thay thế các tham chiếu tới một lĩnh vực thức tĩnh để giá trị của họ trực tiếp, mà làm cho phản xạ vô dụng trên lĩnh vực đó; lĩnh vực thức thực sự có thể được sửa đổi với sự phản ánh, nhưng điều này là rất dễ bị lỗi, và vân vân), nhưng tôi muốn nói rằng bạn có một chặng đường dài để đi trước khi đào sâu hơn nữa.

Cuối cùng, cũng có các từ khóa khác mà có thể được sử dụng với các lĩnh vực, như transient, volatile và cấp độ truy cập (public, protected, private). Nhưng đó là một câu hỏi khác (thực ra, trong trường hợp bạn muốn hỏi về họ, nhiều câu hỏi khác, tôi muốn nói).

+5

+1 để giải thích rõ ràng và tốt! –

+0

@Bruno - FizzBuzz được triển khai như thế nào bằng các biến cuối cùng và các trường cuối cùng. Bạn có thể giải thích. Cảm ơn bạn. – rtindru

+0

@rtindru, gợi ý: suy nghĩ về một lớp học có phương thức đệ quy tạo ra một thể hiện mới của cùng một lớp và đệ quy gọi cùng một phương thức. Khá giả tạo, nhưng có thể làm được. –

25

Tĩnh thành viên là những thành viên có thể truy cập được mà không cần tạo đối tượng. Điều này có nghĩa rằng đó là những thành viên lớp và không có gì để làm với bất kỳ trường hợp nào. và do đó không thể được định nghĩa trong phương thức.

Cuối cùng trong các cụm từ khác, là hằng số (như trong C). Bạn có thể có biến cuối cùng bên trong phương thức cũng như ở cấp lớp. Nếu bạn đặt cuối cùng là tĩnh, nó sẽ trở thành "một thành viên của lớp học không đổi".

+6

+1, để giải thích ngắn gọn và tốt – Naved

+0

@ downvoters vui lòng giải thích – NavSoft

+1

* Bạn có thể có trường cuối cùng bên trong phương thức * - một trường không thể được khai báo bên trong một phương thức. Điều đó sẽ được gọi là biến cuối cùng. –

1

Tôi không thể phân biệt giữa thành viên cuối cùng và thành viên tĩnh cuối cùng. Thành viên tĩnh cuối cùng là thành viên tĩnh được khai báo là là cuối cùng hay cái gì khác? Trong đó các tình huống cụ thể nào nên được sử dụng cụ thể?

Sử dụng final static khi bạn muốn nó là static. Sử dụng final (không tĩnh) khi bạn không muốn nó là static.

Một biến tĩnh hoặc một biến static final không bao giờ có thể được khai báo bên trong một phương pháp không phải bên trong một phương pháp tĩnh cũng không bên trong một thể hiện phương pháp . Tại sao?

Quyết định thiết kế. Không có cách nào để trả lời câu hỏi đó mà không hỏi James Gosling.

Phân khúc mã sau đây cho phù hợp, sẽ không được biên dịch và một lỗi thời gian biên dịch sẽ được ban hành bởi trình biên dịch, nếu một nỗ lực là thực hiện để biên dịch nó.

Vì vi phạm quy tắc bạn vừa mô tả.

1

từ khóa cuối cùng đơn giản có nghĩa là "điều này không thể thay đổi" .Nó có thể được sử dụng với cả trường và biến trong phương thức.Khi biến được khai báo cuối cùng, cố gắng thay đổi biến sẽ dẫn đến lỗi biên dịch.Đối với ví dụ nếu tôi khai báo một biến là int cuối cùng x = 12; cố gắng để tăng x đó là (++ x) sẽ tạo ra một lỗi. Trong ngắn hạn với nguyên thủy cuối cùng làm cho một giá trị một hằng số. Mặt khác, tĩnh chỉ có thể được áp dụng với các trường nhưng không phải trong phương thức.Một trường tĩnh là cuối cùng chỉ có một phần lưu trữ.final cho thấy rằng nó là một hằng số (không thể thay đổi), tĩnh cho thấy nó chỉ là một.

0

Bạn không thể khai báo các trường tĩnh trong khối tĩnh, các trường tĩnh chỉ có thể thuộc về một lớp, do đó lỗi trình biên dịch.

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