почему компилятор запрещает инициализацию массива?

почему компилятор запрещает инициализацию массива?

class Matrix {
    public int[] arr = null;
}

public class Main {
    public static void main(String[] args) {
        Matrix matrix = new Matrix();
        matrix.arr = {1, 2}; // compile error
        System.out.println(matrix.arr[0]);
    }
}

person SergiiGusar    schedule 05.08.2019    source источник
comment
Какая у вас ошибка?   -  person marstran    schedule 05.08.2019


Ответы (2)


Когда вы объявляете массив, вы можете использовать синтаксис public int[] arr = {1,2};, но после объявления, когда вы пытаетесь инициализировать его в другом месте (скажем, в методе), вы не можете использовать сокращение, необходимое для этого, например arr = new int[]{1,2};.

Это связано с тем, что когда вы объявляете массив и инициализируете его некоторыми значениями, public int[] arr = {1,2}; пространство для элементов массива (два в данном случае) выделяется и не может быть изменено позже, если вы не создадите новый объект массива и снова назначьте его этому полю. Свойство final length объекта массива устанавливается, когда вы объявляете его с помощью инициализатора массива.

Но позже, когда вы делаете arr = new int[]{1,2};, вы фактически создаете новый объект массива и назначаете уже объявленному полю.

TL;DR:

Синтаксис инициализатора массива {} разрешен только во время объявления массива, где синтаксис конструктора массива new type[]{} разрешен после объявления в операторе присваивания.

person Fullstack Guy    schedule 05.08.2019

Когда вы создаете массив, вам нужно сделать

matrix.arr = new int[]{1,2};
person mwarren    schedule 05.08.2019