it-roy-ru.com

Как создать массив объектов в 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 будет содержать больше данных.)

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

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

но вторая строка выше выдает ошибку 

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

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

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

5
KDM

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

С здесь :

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 связанных вопроса:

Нет включающего экземпляра типа.

Нет доступного экземпляра типа Server

Ошибка «Нет включающего экземпляра типа» при вызове метода из другого класса в Android

3
Dukeling

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

Test t = new Test();
MyClass[] foo = new MyClass[10];
foo[0] = t.new MyClass();
foo.bar = 0;
6
Rahul Bobhate

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

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

 MyClass foo = new MyClass();

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

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

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

private static class MyClass

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

3
Joachim Sauer

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

Решение состоит в том, чтобы объявить MyClass как private static class.

0
Tony the Pony