2012-04-17 16 views
5

Tôi vừa thử nghiệm và thấy rằng khi tôi chạy mã cuộn, nó không biên dịch và tôi không thể hiểu tại sao.Java - tạo tham chiếu tĩnh đến danh sách trường không tĩnh

IDE của tôi nói 'Không thể tạo tham chiếu tĩnh cho danh sách trường không tĩnh', nhưng tôi thực sự không hiểu điều gì hoặc tại sao điều này xảy ra. Ngoài ra những gì khác nó áp dụng cho, ví dụ: là nó chỉ biến và hoặc các phương pháp tin quá và tại sao ?:

public class MyList { 

    private List list; 

    public static void main (String[] args) { 
     list = new LinkedList(); 
     list.add("One"); 
     list.add("Two"); 
     System.out.println(list); 
    } 

} 

Tuy nhiên, khi tôi thay đổi nó để sau, nó CO làm việc:

public class MyList { 

    private List list; 

    public static void main (String[] args) { 
     new MyList().exct(); 
    } 

    public void exct() { 
     list = new LinkedList(); 
     list.add("One"); 
     list.add("Two"); 
     System.out.println(list); 
    } 

} 
+2

Phương pháp chính là tĩnh. Nó chỉ có quyền truy cập vào các biến thành viên tĩnh và các hàm của lớp kèm theo. Lỗi khá tự giải thích. – Perception

+0

Từ mã của bạn, có vẻ như bạn đang cố tạo một nhà máy singleton. Nếu đó là mục tiêu của bạn, bạn nên thay đổi 'danh sách riêng tư; 'to 'private static Danh sách danh sách;' –

+0

@Perception: Vì vậy, nếu anh ta thay đổi danh sách 'danh sách riêng;' thành 'danh sách liệt kê riêng tĩnh;' trong mã đầu tiên, nó sẽ hoạt động ??? – noMAD

Trả lời

4

trường tĩnh là các trường được chia sẻ trên tất cả các phiên bản của lớp.
trường không phải là thành phần tĩnh/thành viên cụ thể cho một phiên bản của lớp.

Ví dụ:

public class Car { 
    static final int tireMax = 4; 
    int tires; 
} 

Ở đây nó làm cho cảm giác rằng bất kỳ xe nhất định có thể có bất kỳ số lượng lốp xe, nhưng số lượng tối đa là như nhau trên tất cả các xe ô tô.
Nếu chúng tôi thực hiện biến số tireMax có thể thay đổi, việc sửa đổi giá trị có nghĩa là tất cả các ô tô hiện có thể có nhiều lốp (hoặc ít hơn).

Lý do ví dụ thứ hai của bạn hoạt động là bạn đang truy xuất list của một phiên bản MyList mới. Trong trường hợp đầu tiên, bạn đang ở trong bối cảnh tĩnh và không phải trong ngữ cảnh của một cá thể cụ thể, do đó, biến số list không thể truy cập được.

+0

phải là 'final' không chỉ đọc – Lucas

0

Trong ví dụ đầu tiên, bạn đang gọi trường không tĩnh từ nội dung tĩnh, điều này là không thể. Trong phần thứ hai, bạn đang gọi hàm ext trên đối tượng MyList, có quyền truy cập vào trường đó.