2013-03-11 8 views
21

Tôi đã viết mã dưới đây để kiểm tra khái niệm về các lớp và các đối tượng trong Java."Biến không tĩnh này không thể được tham chiếu từ ngữ cảnh tĩnh" khi tạo một đối tượng

public class ShowBike { 
    private class Bicycle { 
     public int gear = 0; 
     public Bicycle(int v) { 
      gear = v; 
     } 
    } 

    public static void main() { 
     Bicycle bike = new Bicycle(5); 
     System.out.println(bike.gear); 
    } 
} 

Tại sao điều này cho tôi lỗi dưới đây trong quá trình biên dịch?

ShowBike.java:12: non-static variable this cannot be referenced from a static context 
     Bicycle bike = new Bicycle(5); 
        ^
+0

Tôi không chắc đây là bản sao hay không. Bài đăng được liên kết dường như không bao gồm các lớp lồng nhau, đó là câu hỏi mà câu hỏi này yêu cầu. – Dukeling

Trả lời

39

Làm cho ShowBike.Bicycle tĩnh.

public class ShowBike { 

    private static class Bicycle { 
     public int gear = 0; 
     public Bicycle(int v) { 
      gear = v; 
     } 

    } 

    public static void main() { 
     Bicycle bike = new Bicycle(5); 
     System.out.println(bike.gear); 
    } 
} 

Trong Java có two types of nested classes: "lớp lồng nhau tĩnh" và "Inner class". Nếu không có từ khóa static nó là một lớp bên trong và bạn sẽ cần một thể hiện của ShowBike để truy cập ShowBike.Bicycle:

ShowBike showBike = new ShowBike(); 
Bicycle bike = showBike.new Bicycle(5); 

lớp lồng nhau tĩnh và các lớp học (không lồng nhau) bình thường là gần như giống nhau về tính năng, đó là chỉ là những cách khác nhau để nhóm mọi thứ. Tuy nhiên, khi sử dụng các lớp lồng nhau tĩnh, bạn không thể đặt các định nghĩa của chúng trong các tệp được phân tách, điều này sẽ dẫn đến một tệp có chứa nhiều định nghĩa lớp.

3

Phương pháp chính không thể truy cập thành viên không tĩnh của lớp học.

Nhân tiện, các lớp học phải được đặt tên theo danh từ, chứ không phải các động từ. Vì vậy, một cách tốt hơn để làm điều đó là:

private class Bicycle { 
    public int gear = 0; 

    public Bicycle(int v) { 
     gear = v; 
    } 

    public void showGear() { 
     System.out.println(gear); 
    } 

    public static void main(String[] args) { 
     Bicycle bike = new Bicycle(6); 
     bike.showGear(); // Notice that the method is named after a verb 
    } 
} 
6

xe đạp là một lớp bên trong, vì vậy bạn cần dụ lớp bên ngoài để tạo ra ví dụ lớp bên trong như:

ShowBike sBike = new ShowBike(); 
Bicycle bike = sBike.new Bicycle(5); 

Hoặc bạn chỉ có thể tuyên bố lớp Bicycle như static để làm theo cách hiện tại của bạn.

1

Lớp xe đạp của bạn không tĩnh và do đó không thể được sử dụng theo phương pháp không tĩnh. Nếu bạn muốn sử dụng nó trong phương pháp chính, hãy thay đổi nó thành

private static class Bicycle 
2

Bạn cần tạo lớp instate đối tượng bên ngoài lớp bên trong. hoặc bạn cần phải làm cho lớp bên trong là tĩnh. vì vậy đối với lớp bên trong không có đối tượng yêu cầu.