2013-05-06 61 views
5

Tôi đang cố tạo một mảng các đối tượng như được định nghĩa bởi một lớp con (tôi nghĩ đó là thuật ngữ chính xác). Tôi có thể thấy rằng câu hỏi là định kỳ, nhưng việc triển khai vẫn còn có vấn đề.Cách tạo một mảng đối tượng trong Java

Mã của tôi

public class Test { 

    private class MyClass { 
     int bar = -1; 
    } 

    private static MyClass[] foo; 

    public static void main(String args[]) { 

     foo = new MyClass[1]; 
     foo[0].bar = 0; 

    }  
} 

Cung cấp cho các lỗi

Exception in thread "main" java.lang.NullPointerException.

Trong một nỗ lực nhằm hợp lý hóa nó, tôi đã phá vỡ nó xuống với các điều khoản đơn giản nhất:

public class Test { 

    private static int[] foo; 

    public static void main(String args[]) { 

     foo = new int[1]; 
     foo[0] = 0; 

    }  
} 

nào xuất hiện để làm việc. Tôi không thấy sự khác biệt giữa hai ví dụ của tôi. (Tôi hiểu rằng đầu tiên của tôi là vô nghĩa, nhưng MyClass cuối cùng sẽ chứa nhiều dữ liệu hơn.)

Tôi khá chắc chắn câu hỏi được yêu cầu here và được trả lời rất tốt. Tôi nghĩ rằng tôi thực hiện các giải pháp:

MyClass[] foo = new MyClass[10]; 
foo[0] = new MyClass(); 
foo[0].bar = 0; 

nhưng dòng thứ hai của các vấn đề trên các lỗi

Không dụ kèm theo các loại thử nghiệm có thể truy cập.

Tôi hiểu rằng ArrayList sẽ là con đường phía trước, nhưng tôi đang cố gắng nắm bắt các khái niệm cơ bản.

NB - Có thể hữu ích khi biết rằng trong khi rất thoải mái với lập trình nói chung, Java là lần đầu tiên tôi nhúng vào lập trình hướng đối tượng.

+1

Hướng dẫn java chapeter ab ra [các lớp lồng nhau] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) có thể là một bài đọc thú vị về các khái niệm cơ bản của các lớp bên trong. – Alderath

Trả lời

3

Lý do int công trình, nhưng MyClass không:

Từ here:

Data Type    Default Value (for fields) 
byte     0 
short     0 
int      0 
long     0L 
float     0.0f 
double     0.0d 
char     '\u0000' 
String (or any object) null 
boolean     false 

Khi bạn khởi tạo một mảng, tất cả các yếu tố đảm nhận giá trị mặc định.

Vì vậy, khi bạn khởi tạo int[], tất cả các phần tử là 0, do đó, không có vấn đề khi sử dụng hoặc gán giá trị mới cho nó.

Nhưng, khi bạn khởi tạo MyClass[], tất cả các thành phần là null, đây là vấn đề khi bạn cố truy cập thành viên của một trong các thành phần.

Nếu bạn không biết tại sao truy cập các thành viên của đối tượng null sẽ không hoạt động, có thể bạn cần phải thực hiện lại 2 bước và đọc một cuốn sách Java.

Lưu ý bổ sung:

Về mặt kỹ thuật, đây:

int[] foo = new int[1]; 
foo[0] = 0; 

thực sự là như thế này:

MyClass[] foo = new MyClass[10]; 
foo[0] = new MyClass(); 

không:

MyClass[] foo = new MyClass[10]; 
foo[0].bar = 0; 

vì bạn chỉ định giá trị mới cho một phần tử, thay vì truy cập thành viên của một phần tử.

Không dụ kèm theo các loại thử nghiệm có thể truy cập:

Những câu trả lời khác bao gồm rằng khá tốt, và đây là 3 câu hỏi liên quan:

No enclosing instance of type is accessible.

No enclosing instance of type Server is accessible

"No enclosing instance of type" error while calling method from another class in Android

+0

Tất cả các câu trả lời tuyệt vời, đều hữu ích, nhưng đây là câu trả lời có ý nghĩa nhất đối với tôi ở giai đoạn này trong sự nghiệp Java của tôi! – KDM

3

Sự cố bạn gặp phải ở cuối ("không có trường hợp kèm theo") thực sự không liên quan đến mảng.

Hãy thử thay thế khối mã cuối cùng của bạn với điều này:

MyClass foo = new MyClass(); 

Bạn sẽ nhận được thông báo lỗi tương tự chính xác, mặc dù không có mảng có liên quan.

Vấn đề ở đây là một lớp bên trong không tĩnh có tham chiếu ngầm định đến thể hiện bên ngoài của nó. Vì bạn không có cá thể bên ngoài (bạn đang ở trong một ngữ cảnh tĩnh, không có this), không thể tạo cá thể MyClass.

Bạn lẽ không cần/muốn có một lớp bên trong và chỉ có thể làm cho nó static:

private static class MyClass 

Ngoài ra: lý do mã của bạn làm việc với int và không phải với MyClass là một int[] giữ Giá trị int (int là loại nguyên thủy), trong khi MyClass[] giữ MyClasstham chiếu (MyClass là kiểu tham chiếu).

6

classMyClassinner classkhông phải là phân lớp. Các lớp bên trong không tĩnh có thể được truy cập bằng cách tạo một đối tượng của lớp bao quanh lớp bên trong. Vì vậy, nếu bạn muốn truy cập vào lớp bên trong, bạn sẽ phải tạo một đối tượng của lớp ngoài trước tiên. Bạn có thể làm điều đó bằng cách:

Test t = new Test(); 
MyClass[] foo = new MyClass[10]; 
foo[0] = t.new MyClass(); 
foo.bar = 0; 
+0

Tôi không chắc chắn nếu đó là những gì tôi muốn làm: Kiểm tra là lớp trên cùng của tôi và tôi không nghĩ rằng tôi muốn tạo ra một thể hiện của nó. Cảm ơn bạn đã tìm kiếm. – KDM

+0

@KDM Nếu bạn không muốn tạo một thể hiện của 'Test', thì bạn có thể muốn làm cho' MyClass' tĩnh. –

0

Bạn không thể sử dụng lớp bên trong không tĩnh từ bên trong phương pháp tĩnh main.

Giải pháp là khai báo MyClassprivate static class.

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