public class Test {
  public static void main(String []args) {
    // code 1
    /*
     * a: l'identificateur d'une boîte de taille 32 bits, utilisant
     * la représentation en complément à 2 et initialisée à la valeur 13
     */
    int a = 13;
    /*
     * le a de gauche désigne la boîte
     * le a de droite désigne la valeur actuellement contenue dans la boîte
     * une fois évaluée l'expression de droite, on stocke la valeur
     * produite dans la boîte a
     */
    a = a + 1;
    /*
     * a désigne la valeur contenue dans la boîte
     */
    System.out.println(a);

    // code 2
    /*
     * pas de boîte, il s'agit d'une valeur «pure»
     */
    System.out.println(13);

    // code 3
    /*
     * b désigne une boîte (32 bits, complément à deux, etc) qui contient
     * une valeur, inconnue et qu'il est interdit par les règles de Java
     * de consulter. variable non initialisée.
     */
    int b;
    /*
     * on stocke une valeur explicite dans la boîte qui désormais peut
     * être utilisée comme on veut.
     */
    b = 12;
    System.out.println(b);

    // code 4
    /*
     * a et b désignent les valeurs contenues dans leurs boîtes
     * respectives
     */
    if (a==b) { System.out.println("oui"); }
    else { System.out.println("non"); }

    // code 5
    /*
     * ta est une variable de nature particulière, la valeur stockée
     * n'est pas manipulable autrement que par affectation, on ne
     * peut consulter cette valeur. La variable est une boîte qui contient
     * une valeur qui peut référencer une autre variable de type indiqué.
     * ta n'est pas un tableau d'entiers. ta est une référence de tableau
     * d'entiers qui ne désigne pour l'instant rien.
     */
    int []ta;
    /*
     * new construit une boîte, ici une boîte (un objet)
     * contenant (entre autres)
     * 5 entiers, numérotés 0, 1, 2, 3, 4 et initialisés à 0 (un tableau
     * de 5 entiers).
     * ta désigne par affectation la boîte créée. La boîte ne possède
     * pas d'identificateur, de nom; elle ne peut être utilisée que
     * par l'intermédiaire de ta.
     */
    ta = new int[5];
    /*
     * la notation ta. ou ta[] permet d'atteindre une partie du contenu
     * de l'objet.
     */
    System.out.println(ta.length);
    System.out.println(ta[1]);

    /*
     * l'affichage de ta produit simplement l'affichage de la valeur de
     * la référence, une donnée technique non véritablement utilisable.
     */
    System.out.println(ta);

    /*
     * ta désigne maintenant un autre objet tableau de 10 entiers.
     * L'objet précédemment désigné ne possède plus de référence, et
     * est par conséquent récupéré par la machine Java et son mécanisme
     * de garbage collection, ramasse-miettes.
     */
    ta = new int[10];
    System.out.println(ta.length);
    System.out.println(ta[1]);

    /*
     * la valeur null, ne peut être employée qu'avec les références
     * pour indiquer que celles-ci ne désignent rien, aucun objet.
     */
    ta = null;
    /*
     * toute tentative d'accès à un object via une référence qui ne
     * désigne rien provoque une erreur grave et prématurée et l'arrêt
     * de l'exécution : java.lang.NullPointerException
     */
    System.out.println(ta.length);
  }
}