IN3R11-2 TD3

Transcription

IN3R11-2 TD3
IN3R11-2 TD3
D. Masson (d’après un sujet de D. Bureau)
2011–2012
Objectifs
– Maı̂triser l’héritage et la redéfinition
– Maı̂triser la méthode equals() héritée de la classe Object
– Écrire correctement du code java (compilable) sur papier (sans l’aide du compilateur)
1
Classe Point
Écrire, en 5 minutes, une classe Point possédant :
– Deux attributs entiers x et y
– Un attibut String public ”name” (public String name = ”Point” ;)
– Un constructeur à 2 paramètres
– Un constructeur sans paramètre qui crée le point à l’origine des axes sans duplication de
code
– Une méthode move à deux paramètres entiers (dx,dy) qui effectue une translation du point
– Une fonction toString() qui retourne le point sous la forme ”(x,y)”
– Une fonction print() qui affiche le point sous la même forme (pas de duplication de code)
Attention à la visibilité de chaque membre.
2
Classe ColoredPoint
Écrire une classe ColoredPoint. Un point coloré est un point qui possède :
– Un attribut color stocké comme une String
– Un attibut String public ”name” (public String name = ”ColoredPoint” ;)
– Un constructeur à 3 paramètres
– Un constructeur à 2 paramètres qui force la couleur à ”Black” sans duplication de code
– Un constructeur sans paramètre qui crée un point noir à l’origine des axes sans duplication
de code
– Une méthode toString() qui retourne le point sous la forme ”couleur :(x,y)” sans duplication de code (y compris avec la super classe)
3
Méthode main
Écrire une méthode main (dans quelle classe ?) effectuant les actions suivantes :
– Déclarer/créer un Point, l’afficher.
– Déclarer/créer un ColoredPoint, l’afficher (faut-il redéfinir print() dans ColoredPoint ?)
– Déplacer le ColoredPoint, l’afficher.
– Qu’affiche le code Point p = new Point(); System.out.println(p.name);
– Qu’affiche le code Point p = new ColoredPoint(); System.out.println(p.name);
– Qu’affiche le code Point p = new ColoredPoint(); System.out.println(((ColoredPoint)p).name);
– Qu’affiche le code Point p = new Point(); p.print();
1
– Qu’affiche le code Point p = new ColoredPoint(); p.print();
– Qu’affiche le code ColoredPoint p = new Point(); p.print();
– Qu’affiche le code Point p = new Point() ; ColoredPoint cp = (ColoredPoint)p; cp.print();
4
Égalité de 2 Point
Voici un extrait de la javadoc de la méthode equals de Object :
public boolean equals(Object obj)
Indicates whether some other object is "equal to" this one. The equals method
implements an equivalence relation on non-null object references:
- It is reflexive: for any non-null reference value x, x.equals(x) should
return true.
- It is symmetric: for any non-null reference values x and y, x.equals(y)
should return true if and only if y.equals(x) returns true.
- It is transitive: for any non-null reference values x, y, and z, if
x.equals(y) returns true and y.equals(z) returns true, then x.equals(z)
should return true.
- It is consistent: for any non-null reference values x and y, multiple
invocations of x.equals(y) consistently return true or consistently return
false, provided no information used in equals comparisons on the objects is
modified.
- For any non-null reference value x, x.equals(null) should return false.
The equals method for class Object implements the most discriminating possible
equivalence relation on objects; that is, for any non-null reference values x
and y, this method returns true if and only if x and y refer to the same object
(x == y has the value true).
Note that it is generally necessary to override the hashCode method whenever
this method is overridden, so as to maintain the general contract for the
hashCode method, which states that equal objects must have equal hash codes.
Pour l’instant, on oublie l’histoire de ”hashCode()”, mais gardez ca dans un coins de votre
mémoire pour plus tard.
– Quelles sont les différences entre ”if(o instanceof Truc)”, ”if(o.getClass()==Truc.class)” et
”if(o.getClass().equals(Truc.class))” ?
– Redéfinir la fonction equals dans Point (Attention à la signature !) en respectant le contrat
général de la méthode equals().
– Redéfinir la fonction equals dans ColoredPoint (en évitant la duplication de code, changez
votre code dans Point si nécessaire)
5
Comptage des points
– Définir un nouvel attribut nbPoint dans Point (dans chaque point ? donc ?)
– Définir une méthode getNbPoints() pour y accéder (et s’il n’y a encore aucun point créé ?)
– Modifier un/certains/tous les constructeur(s) pour incrémenter nbPoints
Bonus Comment faire pour que le code :
p u b l i c c l a s s Test {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] argv ) {
Po i nt p = new Po in t ( 1 , 2 ) ;
2
Po i nt p2 = new Po in t ( 1 , 2 ) ;
System . out . p r i n t l n ( P oi nt . getNbPoints ( ) ) ;
}
}
Affiche 1 et pas 2 ? Attention, après un p2.move(1,1);, par exemple, getNbPoints() devra
renvoyer 2 ! (pensez au dernier cours...)
6
String constantes et equals
Qu’affiche le code :
p u b l i c c l a s s Test {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] argv ) {
S t r i n g s 1 = ” coucou ” ;
S t r i n g s 2 = ” coucou ” ;
System . out . p r i n t l n ( s 1==s 2 ) ;
s 1 = new S t r i n g ( ” coucou ” ) ;
s 2 = new S t r i n g ( ” coucou ” ) ;
System . out . p r i n t l n ( s 1==s 2 ) ;
}
}
Pourquoi ? Quelle différence entre String s = new String("truc"); et String s = "truc"; ?
C’est un exemple classique d’utilisation de == qui semble fonctionner sur des cas simples. Toujours
utiliser equals !
3