Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Инициализаторы массивов

Массивы

В языке Ява массивы являются объектам, которые создаются динамически, и могут иметь значение переменных типа Object.

Объект массива содержит ряд переменных. Число переменных может быть нулевым, в случае когда массив, как говорят, является пустым. Переменные содержащиеся в массиве не имеют никаких имен; вместо этого ссылаются на массив с помощью выражений доступа, которые используют неотрицательные целые значения индекса. Эти переменные называются компонентами массива. При обращении к компонентам массива используют целочисленные индексы от 0 до n-1 включительно.

Все компоненты массива имеют одинаковый тип, который называется типом компонент массива. Если тип компонент массива - T, тогда массив пишется T [].

Тип компоненты массива может быть типом массив. Компоненты из такого массива могут содержать ссылки на подмассивы (т.е. на другие массивы). Если, начиная с какого-нибудь типа массив, рассматривать каждый компонент типа, и снова (если он - также является типом массив) компонент типа следующего типа, и так далее, в конечном счете должны достигнуть тип компоненты, который - не является типом массив; он называется типомэлемента первоначального массива, и компоненты этого уровня структуры данных называются элементами первоначального массива.

Существует ситуация, в которой элемент массива может быть массивом: если тип элемента - Object, тогда некоторый, или все элементы могут быть массивами, потому что любой объект массива может быть присвоен любой переменной типа Object.

Типы массива

Тип массива пишется как имя типа элемента, сопровождаемого некоторым числом пустых пар квадратных скобок []. Число пар скобок указывает на глубину вложения массива. Длина массива - не является частью его типа.

Типом элемента массива может быть любой тип, примитивный или cсылка. В частности:

Разрешается массив с интерфейсным типом таким, как тип компонент. Элементы такого массива могут иметь значением пустую ссылку (null) или экземпляры любого классового типа, который реализует интерфейс.

Разрешается массив с классовым типом abstract как тип компонент. Элементы такого массива могут иметь значением - пустую ссылку (null) или экземпляры любого подкласса класса abstract, который сам не abstract.

Возможные следующие варианты объявления массива:

тип[] имя;
тип имя[];

Объявить имя для массива и создать сам массив можно было на одной строке по следующей схеме:

тип[] имя = new тип[размер];
тип[] имя = {эл0, эл1, …, элN};

 

Переменные-массивы

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

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

Ниже приведены примеры объявления переменных массива, которые не создают массив:

 

int[] ai; // массив типа int

short[][] as; // массив из массивов типа short

Object[] ao, // массив типа Object

otherAo; // массив типа Object

short s, // скаляр short

aas[][]; // массив из массивов типа short

Ниже приведены некоторые примеры объявления переменных массива, которые создают массив объектов:

 

Exception ae[] = new Exception[3];

Object aao[][] = new Exception[2][3];

int[] factorial = { 1, 1, 2, 6, 24, 120, 720, 5040 };

char ac[] = { 'n', 'o', 't', ' ', 'a', ' ',

'S', 't', 'r', 'i', 'n', 'g' };

String[] aas = { "array", "of", "String", };

Скобки [] могут появляться как часть типа в начале описаний, или как часть описания для конкретной переменной, или в обоих случаях сразу, как в этом примере:

byte[] rowvector, colvector, matrix[];

Это объявление эквивалентно следующему:

byte rowvector[], colvector[], matrix[][];

Как только объект массива создан, его длина никогда не изменяется. Чтобы создать переменную-массив, ссылающуюся на массив другой длины, нужна ссылка на различные массивы, которая должна быть присвоена переменной.

Если переменная-массив v имеет тип A [], где A - ссылочный тип, v может содержать ссылку на экземпляр любого типа массив B [], при условии что B может быть присвоен A. Это может происходить в результате времени выполнения на позднем присваивании.

Создание массива

Массив создается выражением создания массива или инициализатором массива.

Выражение создания массива определяет тип элемента, число уровней вложенных массивов, и длину массива, по крайней мере одного из уровней вложения. Длина массива доступна как конечный экземпляр переменной length.

Инициализатор массива создает массив и обеспечивает начальные значения для всех компонент.

Доступ к массиву

К компоненту массива обращаются с помощью выражения доступа к массиву которое состоит из выражения, чье значение - ссылка на массив, сопровождаемая индексным выражением, заключенным в скобки [], как в A [i]. Индексация всех массивов начинается с 0. Массив длиной n может быть индексирован целыми от 0 до n -1.

Массивы должны быть индексированы значениями типа int; short, byte, или также в качестве значений индекса могут использоваться значения типа char, потому что они подвергаются одноместному числовому расширению и становятся значениями типа int (т.е. целые). Попытка доступа к компоненте массива с помощью индекса значение у которого типа long вызовет ошибку времени компиляции.

Все обращения к массиву проверяются во время исполнения; попытка использовать индекс, значение которого меньше нуля или больше чем длина массива вызывает генерацию IndexOutOfBoundsException.

1.5 Массивы: простой пример

Пример:

 

class Gauss {

public static void main(String[] args) {

int[] ia = new int[101];

for (int i = 0; i < ia.length; i++)

ia[i] = i;

int sum = 0;

for (int i = 0; i < ia.length; i++)

sum += ia[i];

System.out.println(sum);

}

}

объявляет переменную ia, которая является переменной типа массив из

Инициализаторы массивов

Инициализаторы массивов могут быть определены в описании, создавая массив и присваивая некоторые начальные значения:

ArrayInitializer:

 

{ VariableInitializersopt,opt }

 

VariableInitializers:

 

VariableInitializer

 

VariableInitializers, VariableInitializer

Инициализатор массива пишется как список выражений разделенных запятой, заключенный в фигурные скобки "{" и "}".

Длина построенного массива будет равняться числу выражений.

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

Если компонент массива сам является массивом, то выражение определяющее компонент может само быть инициализатором массива; то есть инициализатор массива может быть вложен.

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

Как в примере:

class Test {

public static void main(String[] args) {

int ia[][] = { {1, 2}, null };

for (int i = 0; i < 2; i++)

for (int j = 0; j < 2; j++)

System.out.println(ia[i][j]);

}

}

до возникновения NullPointerException при попытке индексирования второго компонента массива ia, который равен null.

Члены массива

Члены массива следующее:

public final поле length (длина), которое содержит число компонентов массива (length (длина) может быть только неотрицательной)

public метод clone, который переопределяет метод того же имени в классе Оbject и не генерирует контролируемых исключительных ситуаций.

Все члены, унаследованные от класса Object; только метод из Object не унаследуется clone.

Массив таким образом имеет те же самые методы что и следующий класс

 

class A implements Cloneable {

public final int length = X;

public Object clone() {

try {

return super.clone();

} catch (CloneNotSupportedException e) {

throw new InternalError(e.getMessage());

}

}

 

}

Каждые массив реализуется интерфейсом Cloneable. Эти массивы являются cloneable, как показано в тестирующей программе:

 

class Test {

public static void main(String[] args) {

int ia1[] = { 1, 2 };

int ia2[] = (int[])ia1.clone();

System.out.print((ia1 == ia2) + " ");

ia1[1]++;

System.out.println(ia2[1]);

}

}

Которая выводит:

false 2

и которая показывает что компоненты массивов, обозначенных через ia1 и ia2, являются различными переменными. (В некоторых ранних реализациях языка Ява этот пример сбивается при компиляции, потому что компилятор неверно полагал, что метод clone для массива может генерировать CloneNotSupportedException.)

Метод сlone многомерного массива создает только одномерный новый массив. Подмассивы оказываются общими, как показано в примере программы:

 

class Test {

public static void main(String[] args) throws Throwable {

int ia[][] = { { 1, 2}, null };

int ja[][] = (int[][])ia.clone();

System.out.print((ia == ja) + " ");

System.out.println(ia[0] == ja[0] && ia[1] == ja[1]);

}

}

Который выводит:

false true

и показывает, что массивы типа int[], которыми являются ia[0] и ja[0] - это один и тот же массив.

<== предыдущая лекция | следующая лекция ==>
 | 


Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных