2013-05-06 3 views
5

Я пытаюсь создать массив объектов, как определено подклассом (я думаю, что это правильная терминология). Я вижу, что вопрос повторяется, но реализация все еще проблематична.Как создать массив объектов в Java

Мой код

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; 

    }  
} 

дает ошибку

Исключение в потоке "основного" java.lang.NullPointerException.

В попытке рационализировать его, я сломал его вниз Проще говоря:

public class Test { 

    private static int[] foo; 

    public static void main(String args[]) { 

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

    }  
} 

который, кажется, работает. Я просто не вижу разницы между двумя примерами. (Я понимаю, что мое первое бессмысленно, но MyClass в конечном итоге будет содержать больше данных.)

Я уверен, что задан вопрос here и на него очень хорошо ответил. Я думаю, что я реализовал решение:

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

, но вторую линию вышеуказанных вопросов ошибки

Нет ограждающий экземпляр типа Test не доступен.

Я действительно понимаю, что ArrayList будет способом продвижения вперед, но я пытаюсь понять основные понятия.

NB - Возможно, было бы полезно знать, что, в то же время очень удобное программирование в целом, Java - это мое первое погружение в объектно-ориентированное программирование.

+1

Учебник java chapeter ab [вложенные классы] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) может быть интересным, прочитанным об основах внутренних классов. – Alderath

ответ

3

Причина int работает, но MyClass не:

От 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 

При инициализации массива все элементы принимают значения по умолчанию.

Итак, когда вы инициализируете int[], все элементы равны 0, поэтому нет проблем с использованием этого или присвоением ему нового значения.

Но при инициализации MyClass[] все элементы: null, что является проблемой при попытке получить доступ к элементу из одного из элементов.

Если вы не знаете, почему доступ к объектам объекта null не будет работать, вам, вероятно, потребуется сделать 2 шага назад и прочитать книгу Java.

Дополнительное примечание:

Технически это:

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

на самом деле больше, как это:

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

нет:

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

, поскольку вы назначаете новое значение элементу, а не получаете доступ к элементу элемента.

Нет ограждающих экземпляр типа Test доступен:

Другие ответы охватывают, что довольно хорошо, и вот 3 вопросы, связанные с:

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

Все фантастические ответы, все полезно, но это тот самый, который имеет для меня большую ценность на этом этапе моей карьеры Java! – KDM

3

Проблема, с которой вы столкнулись в конце («нет закрывающего экземпляра»), фактически не связана с массивами.

Попробуйте заменить свой последний блок кода с этим:

MyClass foo = new MyClass(); 

Вы получите точно такое же сообщение об ошибке, даже если не массивы участвуют.

Проблема заключается в том, что нестатический внутренний класс имеет неявную ссылку на свой внешний экземпляр. Поскольку у вас нет внешнего экземпляра (вы находитесь в статическом контексте, нет), не может быть создан экземпляр MyClass.

You вероятно не нужны/хотят внутренний класс и может просто сделать его static:

private static class MyClass 

также: причина ваш код работал с int, а не MyClass является то, что int[] держит int значения (int примитивный тип), в то время как MyClass[] держит MyClassссылки (MyClass - ссылочный тип).

6

The classMyClass является inner class и не подкласс. Доступ к нестационарным внутренним классам можно получить, создав объект класса, охватывающий внутренний класс. Итак, если вы хотите получить доступ к внутреннему классу, вам сначала нужно создать объект внешнего класса. Вы можете сделать это:

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

Я не уверен, что это то, что я хочу сделать: Тест - это мой самый верхний класс, и я не думаю, что хочу создать его экземпляр. Спасибо, что посмотрели. – KDM

+0

@KDM Если вы не хотите создавать экземпляр 'Test', вы можете захотеть статизировать MyClass. –

0

Вы не можете использовать не статический внутренний класс внутри статического main метода.

Решение должно объявить MyClass как private static class.

Смежные вопросы