Ошибка инициализации объекта в статическом блоке

Я хочу создать массив объектов класса и инициализировать его также без использования какого-либо метода, поэтому я написал такой код:

package test;

public class Test2 {
    private Test2() {
    }

    static Test2[] arr = new Test2[10];
    static {
        for (Test2 ob : arr) {
            ob = new Test2();
        }
        for (Test2 ob : arr) {
            System.out.println(ob);
        }
    }

    public static void main(String args[]) {
    }
}

Но когда я запускаю эту программу, я получаю o/p:

null
null
null
null
....

Почему это происходит? Кажется, что конструктор не вызывается, когда я создаю новый объект

5 ответов

Решение

for (Test2 ob : arr) { дает вам копию ссылки на каждый элемент в arr, Когда ты пишешь ob = new Test2(); ты просто меняешь то, что ob имеет в виду. Это не меняет того, что находится в исходном массиве.

Вам нужно написать код, как arr[n] = new Test2(); вместо.

Вы инициализируете массив. Вы не устанавливаете ссылку в массиве на экземпляр Test2, который вы инициализировали.

Вы создаете объекты, но они никогда не сохраняются в массиве. Вам нужно что-то вроде этого:

for (int i=0; i < arr.length; i++) {
    arr[i] = new Test2();
}

То, что вы делаете, меняется ob переменная 10 раз, и никогда не используйте ее значение.

На каждой итерации цикла ob указывает на null объект в arr, затем установка его значения просто меняет его, чтобы указать new Test2(), не связанные с arr

Вы должны использовать:

    for (int i=0;i<arr.length;i++) {
        arr[i] = new Test2();
    }

Я думаю, что конструктор используется для инициализации объекта, поэтому статический метод не создает никакого объекта. используйте оператор new, а затем конструктор для выделения памяти этому объекту в статическом блоке для создания массива объектов.

Другие вопросы по тегам