2012-06-16 32 views
5

Sự hiểu biết của tôi là các thành viên tĩnh thuộc về lớp đó. Tại sao Java lại cho phép tôi truy cập chúng bằng một đối tượng?Tại sao Java cho phép truy cập của một thành viên tĩnh với một cá thể đối tượng

Để hiểu tôi muốn nói gì, vui lòng xem ví dụ sau:

public class Student { 
    public static int number = 0; 
} 

Đây number là một lĩnh vực tĩnh thuộc về lớp Student, nhưng tôi vẫn có thể truy cập vào nó như hình dưới đây:

Student s = new Student(); 
int n = s.number; 

Lý do cơ bản đằng sau quyết định này là gì?

+0

Tôi đã cố chỉnh sửa câu hỏi của bạn để rõ ràng nhưng không thể. Tôi không thể hiểu bạn đang hỏi gì? –

+2

Tôi đã từ bỏ "máu đầu tiên" –

+1

Google Dịch lúc tốt nhất của nó :) – buc

Trả lời

7

Lý do đằng sau điều này là một đối tượng là một thể hiện của lớp, và do đó nó sẽ có thể truy cập mọi thuộc tính thuộc về lớp ngoài các thuộc tính mức cá thể.

Giống như thư truyền thống. Nếu bạn nhận được một thư được gửi đến cả gia đình bạn (thành viên tĩnh), bạn sẽ cảm thấy được phép mở nó, bởi vì bạn là thành viên của gia đình. Mặt khác, nếu thư được gửi đến cho bạn (thành viên cá thể), chỉ bạn mới có quyền mở nó, không ai khác trong gia đình bạn.

Điều này cũng hoạt động tương tự trong các ngôn ngữ hướng đối tượng khác, như C++. Tuy nhiên, không khuyến khích sử dụng ký hiệu s.number để truy cập các thành viên tĩnh, vì nó gây hiểu nhầm cho người đọc mã của bạn. Bạn nên luôn sử dụng ký hiệu Student.number, vì điều này cho thấy rõ ràng rằng number là một thành viên tĩnh. Các ngôn ngữ hiện đại, ví dụ C# sẽ đưa ra cảnh báo nếu bạn truy cập các thành viên tĩnh thông qua biến mẫu, nhưng nó vẫn hoàn toàn hợp pháp theo đặc tả ngôn ngữ.

+0

Cảm ơn bạn đã trả lời câu hỏi của bạn, bạn đã yêu thích câu đố của tôi. Tôi sử dụng C#, vì vậy tôi có cái này. – Myd

0

Lý do đằng sau này là ... JLS - Chapter 8.3.1.1. static Fields

+4

Tôi không thấy bất kỳ cơ sở lý luận nào trong JLS: chỉ đơn giản là bạn có thể truy cập nó trên một đối tượng. –

+0

+1 để tham khảo. Đó là một lựa chọn mà họ đã thực hiện khi thiết kế ngôn ngữ. – dacwe

+1

Bạn đúng, không phải là lý do chính đáng. Câu hỏi ban đầu hỏi tại sao anh ta có thể làm được điều này. Vì vậy, tôi nghĩ rằng liên kết có thể hữu ích. – Behe

4

Sau khi một số đọc rõ ràng Trình biên dịch java hiện không may cần thiết để đối phó với trường hợp đối tượng truy cập các biến tĩnh và nó biết những gì bạn muốn, bạn có nghĩa là .. IDE sẽ cho bạn một cảnh báo về nó ..

về lý do tại sao và giải thích đọc: Why isn't calling a static method by way of an instance an error for the Java compiler?

cuối cùng nó là một spec ngôn ngữ và bạn chỉ cần để đối phó với nó .. nó cuộc gọi của bạn có sử dụng nó hay không. Đề xuất của tôi: DONT!

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