2012-03-19 37 views
6

Tại sao chúng ta có thể truy cập một biến tĩnh từ đối tượng trong Java, như mã dưới đây?Truy cập biến tĩnh từ đối tượng trong Java

public class Static { 
    private static String x = "Static variable"; 

    public static void main(String[] args) 
    { 
    Static member = new Static(); 
    System.out.println(member.x); 
    } 
} 
+1

Tại sao không? Bạn có lý do gì mà bạn nghĩ rằng điều đó không nên có thể? – EJP

+1

Bạn cũng có thể làm Static.x không cần tạo đối tượng. – nikhil

+0

IIRC, Josh Bloch đã nói rằng cho phép đây là một quyết định tồi tệ. –

Trả lời

8

Nói chung, các biến công cộng có thể được truy cập bởi tất cả mọi người và các biến riêng tư chỉ có thể được truy cập từ trong cá thể hiện tại của lớp đó. Trong ví dụ của bạn, bạn được phép truy cập biến số x từ phương thức main, bởi vì phương thức đó nằm trong lớp tĩnh. Nếu bạn đang tự hỏi tại sao bạn được phép truy cập nó từ một thể hiện khác của lớp tĩnh hơn lớp bạn đang sử dụng (thường không được phép cho các biến riêng tư), nó đơn giản chỉ vì các biến tĩnh don ' t tồn tại trên cơ sở từng trường hợp, nhưng trên cơ sở mỗi lớp. Điều này có nghĩa là cùng một biến tĩnh của A có thể được truy cập từ tất cả các phiên bản A.

Nếu đây không phải là trường hợp, không ai có thể truy cập biến tĩnh riêng tư, vì nó không thuộc về một ví dụ, nhưng tất cả đều là.

1

biến tĩnh được gọi là biến lớp, vì chúng có sẵn cho từng đối tượng của lớp đó.

Vì thành viên là đối tượng của lớp tĩnh nên bạn có thể truy nhập tất cả tĩnh như wll dưới dạng biến tĩnh của lớp tĩnh thông qua đối tượng thành viên.

+2

Không trả lời câu hỏi, không phải là câu trả lời. – EJP

2

Thực tiễn tốt nhất không nên tham chiếu biến tĩnh theo cách đó.

Tuy nhiên câu hỏi của bạn là tại sao nó được phép? Tôi đoán câu trả lời là một nhà phát triển có thể thay đổi một thành viên cá thể (trường hoặc biến) thành một thành viên tĩnh mà không phải thay đổi tất cả các tham chiếu đến thành viên đó.

Điều này đặc biệt đúng trong môi trường nhiều nhà phát triển. Nếu không mã của bạn có thể không biên dịch chỉ vì đối tác của bạn đã thay đổi một số biến mẫu thành biến tĩnh.

0

Thành viên không tĩnh là thành viên cá thể. Thành viên tĩnh (lớp rộng) không thể truy cập các thành viên cá thể bởi vì, không có cách nào để xác định cá thể nào sở hữu bất kỳ thành viên không tĩnh nào cụ thể.

Đối tượng thể hiện luôn có thể đề cập đến các thành viên tĩnh vì nó thuộc về lớp mà toàn cục (được chia sẻ) với các phiên bản của nó.

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