{super(xi,yi); l = li;}
void setL(int xi,int yi,char li)
{set(xi,yi); l=li;}
char getL() {return l;}
void printL()
{System.out.println(getX()+";"+getY()+":"+l);}
}
Mettre en oeuvre cette classe de la façon suivante :
LPoint pt = new LPoint();
pt.printL();
pt.setL(5,2,'b'); pt.printL();
pt.move(-6,4); pt.printL();
Vous avez défini ici votre première relation d’héritage entre la classe LPoint et Point à l’aide du
mot clé extends. A travers cette nouvelle classe, vous avez encapsulé et formalisé l’utilisation de la
donnée membre l (le label du point).
Dans la classe LPoint vous n’avez plus accès aux données membres x et y de l’objet Point. En
effet, une classe dérivée n’a pas accès aux données privées de sa classe mère. Vous n’avez
également plus accès à la méthode check() privée de la classe mère. Vous avez accès cependant à
l’ensemble des méthodes non déclarées private, comme la méthode move() par exemple.
En Java, un objet dérivé doit impérativement prendre en charge la construction de l’objet père.
Cette prise en charge est assurée par l’appel des constructeurs de l’objet père via le mot clé super.
Cette instruction est toujours la première exécutée dans le constructeur d’une classe dérivée.
Commenter les appels des constructeurs de l’objet père via le mot clé super. Vous pouvez pour
cela baliser vos constructeurs avec des fonctions d’affichage de la manière suivante :
LPoint() { System.out.println("1");}
Redéfinir la méthode printL() de la classe LPoint de la façon suivante, commenter.
super.print();
System.out.println(":"+l);
La classe racine Object
Mettre en oeuvre la classe Point de la façon suivante:
Point pt = new Point();
System.out.println(pt.toString());
Vous avez fait appel ici à une méthode toString() que vous n’avez pas définie dans votre classe
Point. Cette méthode est en fait une méthode de la classe racine Object. En effet, toute classe en
Java hérite implicitement de cette classe. Vous avez donc accès à toutes les méthodes de la classe
Object quelque soit l’objet que vous créez.
Aller consulter dans l’API specification la documentation de la classe Object afin de commenter
l’action de cette ligne de code.
System.out.println(pt.getClass().getName());
Garbage collector
La notion de destructeur n’existe pas en Java. La démarche employée en Java est un mécanisme de
gestion automatique de la mémoire connu sous le nom de garbage collector (ou ramasse-miettes).
Le principe d’utilisation du garbage collector est basé sur l’analyse des liens entre références et
objets alloués. Dès qu’un objet n’est plus référencé (sortie d’une boucle contenant une référence
locale par exemple) il devient alors candidat au garbage collector. Cette candidature se traduit par
l’appel de la méthode finalize() héritée de la classe racine Object. Le garbage collector est
automatiquement déclenché par la machine virtuelle Java selon l’état de la mémoire du système, il
désalloue alors tous les objets candidats.
Il est cependant possible de forcer le déclenchement du garbage collector. Implémenter, la classe
suivante:
class MyOb {
MyOb() {print();}
String getID()
{return Integer.toHexString(hashCode());}
void print()
{System.out.println(getID());}
protected void finalize()
{System.out.println("finalize: "+getID());}
}