Par exemple,
Point[] tp = new Point[3];
définit tp comme une référence à un tableau de longueur 3, dont
les éléments sont des références à des instances de Point ; la
valeur initiale de ces éléments est null, et aucune instance de
Point n'est créée (figure ). Il faut invoquer
explicitement un constructeur pour chacun de ses éléments
(figure
) :
for (int i=0; i<tp.length; i++) tp[i] = new Point();
On peut aussi initialiser explicitement les éléments d'un tableau de la façon suivante (dans ce cas, on ne doit pas spécifier la longueur dans l'expression de construction new Point[]):
Point[] tp = new Point[] { new Point(), new Point(1, 2), new Point(2, 1) };
Si et
sont des types de références, et si
est un sous-type
de
, alors
est un sous-type de
.
Par exemple, un tableau de PointColore peut être affecté à une
variable de type Point. Cette affectation ne transforme
cependant pas le tableau de PointColore en un tableau de
Point. Ainsi, si l'on tente d'affecter à l'un de ses éléments
une instance de Point, l'exception ArrayStoreException
est déclenchée :
class Point { int x, y; } class PointColore extends Point { java.awt.Color couleur; } class Test { public static void main(String[] args) { Point[] tp = new PointColore[4]; tp[0] = new Point(); // ERREUR : ArrayStoreException } }
En effet, un Point ne peut pas être affecté à un PointColore. Cette situation échappe au typage statique : le compilateur accepte ce programme, puisque la variable tp[0] est de type Point et le membre droit de l'affectation est du même type. La possibilité de cette erreur impose une vérification par la Machine Virtuelle Java, du type de la valeur affectée aux éléments d'un tableau de références.
Signalons que le sous-typage des tableaux ne concerne que les types de références et non les types primitifs : un tableau de byte ne peut pas être affecté à une variable de type int[].