Les objets en Java
Objectif
Ce laboratoire a pour but de vous faire réviser quelques concepts fondamentaux de Java, y compris les classes et les objets. Le laboratoire va aussi vous permettre de vous (re-)familiariser avec l’environnement de développement logiciel Eclipse.
Remise et date d’échéance
Vous devez remettre par courriel votre rapport de laboratoire et le code source pour la partie 2 avant de début du prochain laboratoire. Votre rapport doit être en en format PDF. Dans Microsoft Word, vous pouvez créer un fichier PDF avec le menu File > Save as...
.
Le rapport doit inclure vos réponses aux questions ci-dessous avec une discussion sur ce que vous avez appris, les découvertes que vous avez faites, ce qui a été difficile dans le laboratoire, etc. Soyez concis!
Introduction
Un objet est un exemple de données abstraites. En plus d’emmagasiner les données (les attributs), l’objet dispose également d’un ensemble d’opérations (les méthodes) qu’il peut exécuter. Un objet est donc une structure de données avec une partie consacrée aux données et une à l’exécution.
Un programme Java est une collection d’objets qui accomplissent une certaine tâche en échangeant des messages entre eux. Un objet qui transmet un message à un autre objet est implémenté comme un objet qui appelle l’exécution d’une méthode d’un autre objet. Les objets ont donc un ensemble de messages (ou de méthodes) auxquels ils répondent, l’ensemble des messages auxquels un objet répond est l’interface pour cet objet.
Chaque objet a sa propre mémoire composée d’autres objets ou de types primitifs. Chaque objet a un ou plusieurs types. Tous les objets d’un type particulier peuvent recevoir les mêmes messages (car ils partagent tous la même interface).
La classe d’un objet établit un de ces types. Toutes les variables et méthodes sont indiquées dans la définition de classe. Ainsi une classe indique quel genre de donnés et quelles méthodes forment l’interface pour tous les objets d’un certain type. Une fois qu’une classe a été définie, les objets peuvent être instanciés ou créés à partir de la définition de classe. Un objet est une instance d’un type de données abstrait (une classe).
Un objet peut être considéré comme une instance de n’importe laquelle de ses superclasses, ou des interfaces Java qu’il implante, ou des interfaces implantées par ces superclasses.
Pour répondre aux questions posées dans ce laboratoire, vous pouvez vous référer à n’importe quel manuel de référence Java (ou moteur de recherche en ligne). Toutefois, assurez-vous d’indiquer clairement vos sources lorsque vous référez à différents ouvrages dans vos réponses.
Préparation
Avant de commencez, lisez le guide de survie d’Eclipse.
Téléchargez et sauvegardez le fichier: wallball.zip. Ne le dézippez pas.
Lancez le programme Eclipse pour Java et créez un nouveau projet Java nommé, par exemple, GEF320 labo 1
. Utilisez le JRE par défaut et choisissez l’option pour avoir des dossiers séparées pour les fichiers source et classe.
Sélectionnez votre projet dans le panneau Package Explorer
, faites un clic droit et choisissez Import
. Dans la boîte de dialogue, choisissez General > Archive File
comme type, trouvez votre copie de wallball.zip
et importez-la.
Ouvrez le projet (cliquez sur le petit plus) et le dossier « src ». Vous y trouverez les trois paquets et les huit fichiers sources Java suivants:
wallballgame
Ball.java
Paddle.java
WallBallEquipment.java
wallballgui
WallballApp.java
WallballFrame.java
WallballView.java
wallballsupport
Collidable.java
Path.java
Le programme implémente un jeu très simple appelé Wall Ball (un peu comme l’ancien jeu vidéo Pong, mais pour un seul joueur). Pour lancer le jeu, sélectionnez le fichier WallballApp.java
et cliquez sur l’icône d’exécution (Run) dans la barre à outils (le triangle blanc dans un cercle vert). Jouez un peu avec le jeu pour voir comment il fonctionne.
Partie 1 — Compréhension du programme
Répondez aux questions suivantes à partir du code fourni. Vous pouvez utiliser l’API Java 8 et le tutorial Java.
Les Classes, les Objets et leur création
1. Donnez un exemple de classe.
2. Donnez un exemple d’objet.
3. Donnez un exemple de constructeur.
4. Dans la classe WallballView
, BORDER
est une variable d’attribut. Est-ce que BORDER
est un objet? Expliquez votre réponse.
5. Dans la classe WallballView
, thePaddle
est une variable d’attribut. Est-ce que thePaddle
est un objet? Expliquez votre réponse.
Création d’objets et initialisation
Jettons maintenant un coup d’oeil à l’initialisation des objets et plus spécifiquement l’initialisation des références aux objets (l’attribution de la mémoire pour les objets courrants et la connexion entre un objet et une variable de référence). Vous pouvez initialiser une référence aux moments suivants:
- Lorsque l’objet contenant la référence est défini. Cela signifie que les références seront toujours initialisées avant que le constructeur soit appelé.
- Dans le constructeur de l’objet qui contient la référence.
- Juste avant que vous deviez réellement utiliser l’objet. Dans certains cas, cela peut réduire le temps d’initialisation ou l’espace mémoire nécessaire si, pendant l’exécution, l’objet n’a pas besoin d’être créé.
6. Donnez un exemple de chacun de ces trois mécanismes d’initialisation trouvé dans les classes données.
7. Quel serait l’effet d’utiliser Integer
plutôt que int
pour spécifier les types de width
et height
dans WallBallEquipment
? Que-est-ce que c’est la différence entre int
et Integer
?
Classes et interfaces
Le paquet wallballgame
contient trois classes. Deux de ces classes, Ball
et Paddle
, sont des extensions de (« extends ») la classe WallBallEquipment
. La classe WallBallEquipment
implémente (« implements ») l’interface Collidable
du paquet wallballsupport
.
8. Dans vos propres mots, expliquez la différence entre une classe et une interface dans le langage de programmation Java.
9. Quelle est la signification d’une classe qui est une extension d’une autre?
10. Quelle est la signification d’une classe qui implémente une interface?
11. Les constructeurs pour Ball
et Paddle
contiennent des expressions qui ressemblent à super(fgColor, bgColor, x, y)
. Quelle est l’effet de cette expression et pourquoi est-elle nécessaire?
12. La classe WallBallEquipment
a deux constructeurs. Un des deux contient l’expression this(fgColor, bgColor)
. Quelle est la signification du mot clé « this
» dans Java et comment est-il utilisé dans cette expression?
Invocation des méthodes
13. Expliquez dans vos propres mots comment la méthode suivante de la classe WallBallView
détermine si le Paddle
a frappé la Ball
. Indice: Des objets sont retournés pour chaque appel de méthode dans l’expression if
.
private void checkHit(Collidable theBall, Collidable thePaddle) {
if (thePaddle.getBoundingRectangle()
.intersects(theBall.getBoundingRectangle())) {
theBall.getPath().reverseHorizontal();
}
}
Conception de programme
14. Le code dans le projet WallBall
contient plusieurs nombres magiques (c-à-d des « constantes numériques non-nommées »). Expliquez dans vos propres mots ce que les nombres magiques sont et pourquoi il faut les éviter dans votre code.
15. Lequel des principes discutés pendant le premier cours recommande l’élimination des nombres magiques?
16. Faites de la recherche au sujet du principe de responsabilité simple et résumez-le brièvement dans vos propres mots.
17. Est-ce que la classe WallBallView
est conforme au principe de responsabilité simple? Justifiez votre réponse avec un exemple tiré du code dans la classe WallBallView
.
Partie 2 – Modification du programme
Vous avez peut-être remarqué que le menu Paddle Size
du jeu ne fait rien. Modifiez le programme pour régler ce problème. Vous pouvez étudier le code qui modifie la couleur de la raquette pour trouver des indices pour la solution. La modification demandera l’addition d’environ une douzaine de lignes de code à trois classes (en fonction de votre solution).
Lorsque vous arriverez à faire changer la grandeur de la raquette correctement. Si la modification de taille se produit près de la frontière de la fenêtre, il est possible que la raquette ne soit plus capable de bouger. Il n’est pas nécessaire de régler ce problème.