Spec-Zone .ru
спецификации, руководства, описания, API
|
ГЛАВА 10
Массивы Java являются объектами (§4.3.1), динамически создаются, и могут быть присвоены переменным типа Object
(§4.3.2). Все методы класса Object
может быть вызван на массив.
Объект массива содержит много переменных. Число переменных может быть нулем, когда массив, как говорят, пуст. У переменных, содержавшихся в массиве, нет никаких имен; вместо этого на них ссылаются выражения доступа массива, которые используют неотрицательные целочисленные индексные значения. Эти переменные вызывают компонентами массива. Если у массива есть n компоненты, мы говорим, что n является длиной массива; на компоненты массива ссылаются, используя целочисленные индексы от 0 до, включительно.
У всех компонентов массива есть тот же самый тип, названный компонентным типом массива. Если компонентный тип массива является T, то тип самого массива пишется T[]
.
Компонентный тип массива может самостоятельно быть типом массива. Компоненты такого массива могут содержать ссылки на подмассивы. Если, запускаясь с какого-либо типа массива, каждый рассматривает его компонентный тип, и затем (если это - также тип массива), компонентный тип того типа, и так далее, в конечном счете нужно достигнуть компонентного типа, который не является типом массива; это вызывают типом элемента исходного массива, и компоненты на этом уровне структуры данных вызывают элементами исходного массива.
Есть одна ситуация, в которой элемент массива может быть массивом: если тип элемента Object
, тогда некоторые или все элементы могут быть массивами, потому что любой объект массива может быть присвоен любой переменной типа Object
.
[]
. Число пар скобки указывает на глубину вложения массива. Длина массива не является частью своего типа. Тип элемента массива может быть любым типом, или примитивный или ссылочный. В особенности:
abstract
тип класса как компонентный тип позволяется. Элементы такого массива могут иметь как их значение нулевая ссылка или экземпляры любого подкласса abstract
класс, который не является самостоятельно abstract
. Поскольку длина массива не является частью своего типа, единственная переменная типа массива может содержать ссылки на массивы различных длин.
Вот примеры объявлений переменных типа массив, которые не создают массивы:
int[] ai; // array of int short[][] as; // array of array of short Object[] ao, // array of Object otherAo; // array of Object short s, // scalar short aas[][]; // array of array of 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. Это может привести к исключению на этапе выполнения на более позднем присвоении; см. §10.10 для обсуждения.
Выражение создания массива определяет тип элемента, число уровней вложенных массивов, и длины массива для по крайней мере одного из уровней вложения. Длина массива доступна как заключительная переменная экземпляра length
.
Инициализатор массива создает массив и обеспечивает начальные значения для всех его компонентов. (Противопоставьте это с C и C++, где для инициализатора массива возможно определить начальные значения для некоторых, но не всех компонентов массива.)
[
и ]
, как в A[i]
. Все массивы 0
- источник. Массив с длиной n может быть индексирован целыми числами 0
к n-1
. Массивы должны быть индексированы int
значения; short
, byte
, или char
значения могут также использоваться в качестве индексных значений, потому что они подвергаются унарному числовому продвижению (§5.6.1) и становятся int
значения. Попытка получить доступ к компоненту массива с a long
индексируйте результаты значения в ошибке времени компиляции.
Во время выполнения проверяются все доступы массива; попытка использовать индекс, который является меньше чем нуль или больше чем или равный длине массива, вызывает IndexOutOfBoundsException
быть брошенным.
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); } }это производит вывод:
5050объявляет переменную
ia
у этого есть массив типа int
, то есть, int[]
. Переменная ia
инициализируется, чтобы сослаться на недавно создаваемый объект массива, создаваемый выражением создания массива (§15.9). Выражение создания массива определяет, что массив должен иметь 101
компоненты. Длина массива является доступным использованием поля length
, как показано. Пример программы заполняет массив целыми числами от 0
к 100
, суммы эти целые числа, и печатные издания результат.
ArrayInitializer:Следующее повторяется от §8.3, чтобы сделать представление здесь более четким:
{
VariableInitializersopt,
opt}
VariableInitializers:
VariableInitializer
VariableInitializers,
VariableInitializer
VariableInitializer:Инициализатор массива пишется как список разделенных запятой значений выражений, включенных фигурными скобками"
Expression
ArrayInitializer
{
"и"}
".Длина созданного массива будет равняться числу выражений.
Каждое выражение определяет значение для одного компонента массива. Каждое выражение должно быть совместимым с присвоением (§5.2) с компонентным типом массива, или ошибка времени компиляции заканчивается.
Если компонентный тип является самостоятельно типом массива, то выражение, определяющее компонент, может самостоятельно быть инициализатором массива; то есть, инициализаторы массива могут быть вложены.
Запаздывающая запятая может появиться после последнего выражения в инициализаторе массива и игнорируется.
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]); } }печатные издания:
1 2прежде, чем вызвать a
NullPointerException
в попытке индексировать второй компонент массива ia
, который является нулевой ссылкой. public
final
поле length
, который содержит число компонентов массива (length
может быть положительным или нуль),
public
метод clone
, который переопределяет метод того же самого имени в классе Object
и не выдает проверенных исключений
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
различные переменные. (В некоторых ранних реализациях Java этот пример, отказавший, чтобы скомпилировать, потому что компилятор, которому неправильно полагают, что метод клона для массива мог бросить a CloneNotSupportedException
.) A clone
из многомерного массива мелко, который должен сказать, что создает только единственный новый массив. Подмассивы совместно используются, как показано примером программы:
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]
и int[]
массив, который является ja[0]
тот же самый массив. Class
Объекты для МассивовClass
объект, совместно использованный со всеми другими массивами с тем же самым компонентным типом. Суперкласс типа массива, как полагают, Object
, как показано следующим примером кода: class Test { public static void main(String[] args) { int[] ia = new int[3]; System.out.println(ia.getClass()); System.out.println(ia.getClass().getSuperclass()); } }который печатает:
class [I class java.lang.Objectгде строка"
[I
"подпись типа времени выполнения для массива "объекта класса с компонентным типом int
" (§20.1.1). String
char
не a String
(§20.12), и ни один a String
ни массив char
завершается '\u0000'
(символ NUL). Java String
объект является неизменным, то есть, его содержание никогда не изменяется, в то время как массив char
имеет изменчивые элементы. Метод toCharArray
в классе String
возвращает массив символов, содержащих ту же самую символьную последовательность как a String
. Класс StringBuffer
реализует полезные методы на изменчивых массивах символов (§20.13).
[]
, где A является ссылочным типом, тогда v может содержать ссылку на экземпляр любого типа B массива[]
, если B может быть присвоен A.
class Point { int x, y; }
class ColoredPoint extends Point { int color; }
class Test { public static void main(String[] args) { ColoredPoint[] cpa = new ColoredPoint[10]; Point[] pa = cpa; System.out.println(pa[1] == null); try { pa[0] = new Point(); } catch (ArrayStoreException e) { System.out.println(e); } } }производит вывод:
true java.lang.ArrayStoreExceptionЗдесь переменная
pa
имеет тип Point[]
и переменная cpa
имеет как его значение ссылка на объект типа ColoredPoint[]
. A ColoredPoint
может быть присвоен a Point
; поэтому, значение cpa
может быть присвоен pa
. Ссылка на этот массив pa
, например, тестирование, ли pa[1]
null
, не будет приводить к ошибке типа времени выполнения. Это то, потому что элемент массива типа ColoredPoint[]
a ColoredPoint
, и каждый ColoredPoint
может помочь для a Point
, с тех пор Point
суперкласс ColoredPoint
.
С другой стороны, присвоение на массив pa
может привести к ошибке периода выполнения. Во время компиляции, присвоение на элемент pa
проверяется, чтобы удостовериться, что присвоенное значение является a Point
. Но с тех пор pa
содержит ссылку на массив ColoredPoint
, присвоение допустимо, только если тип значения, присвоенного во время выполнения, более определенно, a ColoredPoint
.
Java проверяет на такую ситуацию во время выполнения, чтобы гарантировать, что присвоение допустимо; в противном случае ArrayStoreException
бросается. Более формально: присвоение на элемент массива, тип которого является A[]
, то, где A является ссылочным типом, проверяется во время выполнения, чтобы гарантировать, что присвоенное значение может быть присвоено фактическому типу элемента массива, где фактический тип элемента может быть любым ссылочным типом, который присваиваем A.
Содержание | Предыдущий | Следующий | Индекс
Спецификация языка Java (HTML, сгенерированный Блинчиком "сюзет" Pelouch 24 февраля 1998)
Авторское право © Sun Microsystems, Inc 1996 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к doug.kramer@sun.com