next up previous contents index
suivant: 5.3 Interfaces monter: 5. Tout un monde précédent: 5.1 La classe Object   Table des matières   Index


5.2 Tableaux d'objets

Les éléments d'un tableau étant nécessairement des valeurs, il n'y a pas de tableaux d'objets, mais seulement des tableaux de références à des objets.

Figure: Création d'un tableau de Point ; aucune instance de Point n'est créée.
\begin{figure}\ \begin{center}
\leavevmode
\fbox{
\epsfig{file=fig/tab1o.eps}
} \end{center} \end{figure}

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();

Figure: Tableaux : création des éléments.
\begin{figure}\begin{center}
\leavevmode
\fbox{
\epsfig{file=fig/tab1oi.eps}
} \end{center} \end{figure}

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)
               };


5.2.0.0.1 Sous-typage des tableaux

Si $t$ et $t'$ sont des types de références, et si $t$ est un sous-type de $t'$, alors $t\texttt{[\,]}$ est un sous-type de $t'\texttt{[\,]}$. 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[].


next up previous contents index
suivant: 5.3 Interfaces monter: 5. Tout un monde précédent: 5.1 La classe Object   Table des matières   Index
Rene' LALEMENT 2001-11-07