Liste des cours‎ > ‎

Introduction à Java (8 octobre)

Notes de cours

Caractérisations


C : langage compilé, édition + compilation + édition de liens + éxécution
Python : langage de script, édition + exécution
Java : langage compilé, édition + compilation + édition de liens + exécution -- machine virtuelle
  • C : typage faible -- possibilité de convertir une chaîne en entier (adresse en mémoire) et vice-versa
  • Python : langage objet, typage fort dynamique -- exemple : liste
  • Java : langage objet, typage fort statique -- exemple : liste de string

L'objet

But : modéliser des comportements communs (encapsulation) + dérivation.
  • Critères communs : classe.
  • Individu appartenant à une classe : instance. L'instance est d'une classe (type) donnée, mais appartient à la hiérarchie.
  • Propriété propre à l'instance : champs (ou membres ou attributs).
  • Fonctions permettant d'interagir avec l'individu : méthodes.
Comme pour les fonctions, chaque méthode doit faire une seule chose et bien le faire. Ne pas hésiter à implémenter d'autres méthodes pour factoriser les changements. Idée sous-jacente : envoi de messages à l'objet.

Comme pour les champs, méthodes peuvent être privées.

L'objet est construit avec un constructeur, qui initialise les champs à des valeurs correctes à partir des arguments donnés.

Spécial : méthodes et champs de classe (opposés à instance), pour réunir des comportements communs ne dépendant pas de l'instance.

Java

Fichiers organisés en packages.
Packages hiérarchiques.
Organisation du source hiérarchique.
Une seule classe par fichier source, nommée à partir de ce fichier.

Convention : classe => majuscule, package => minuscule, variable => minuscule.

Compilation d'un .java en .class.
Regroupement des .class en .jar, i.e. .zip avec les infos de classe + d'autres fichiers si nécessaire.

Beaucoup de bibliothèques existantes.

Pour trouver ses fichiers, le compilateur et la machine virtuelle ont besoin qu'on leur communique leur chemin à travers le classpath. Un chemin peut être un répertoire, ou une archive jar.

Chaque constructeur doit appeler le constructeur parent en premier. Tout dérive de java.lang.Object sauf les types primitives (ou natifs). java.lang.Object implémente notamment toString.
Constructeur porte le nom du type. Pas de type de retour. Utilisation avec "new Point".
À partir du moment où il y a au moins un constructeur explicite, un constructeur doit être appelé, sinon le constructeur implicite est appelé automatiquement.

Une variable ne contient pas un objet, mais stocke une référence sur l'objet.

Affichage avec System.out.println (dans java.lang, importé automatiquement).

Types : types natifs (int, float, double, char) et types objets (Integer, Float, Double, Character, String, List<...>, ...[]).
Différence : passage par copie ou par copie de la référence.

Visibilité : public, private, protected, default (package).

Programme principal en tant que fonction statique (de classe, pas besoin d'instance) qui permet de récupérer les arguments de la ligne de commande : public static void main(String[] args).

Valeur par défaut pour les objets : null. 0 pour les autres.

Une classe abstraite ne peut pas être instanciée directement. Une méthode abstraite (dans une classe abstraite) doit obligatoirement être surchargée dans toutes les classes filles concrètes (non abstraites).

Premier programme

Toutes les classes devront être dans un package fr.enst.bank.

Écrire une classe représentant un compte en banque (Account), contenant un solde (balance, de type double). On peut effectuer un dépôt (deposit) d'un certain montant (amount) ou retirer de l'argent (withdrawal) d'un certain montant (amount). Tester avec un programme principal Bank

Attention : le champ balance ne doit pas être accessible de l'extérieur, afin que n'importe qui ne puisse pas modifier sa valeur. Il faut donc créer un accesseur, getBalance(), qui permet de récupérer la valeur du solde.

Rajouter un virement (transfer) qui prend une somme et un compte destinataire (target). Vérifier.

Pour faciliter l'affichage, rajouter un champ nom (name) aux comptes, et surchargez la méthode (toString) qui est implémentée dans Object pour renvoyer une chaîne contenant "<Account NAME - balance: BALANCE>" où NAME et BALANCE sont remplacés par les champs correspondants.

Rajouter un prélèvement (directDebit) depuis un compte source (source) en réutilisant au maximum le code existant.

Un champ qui ne doit plus être modifié après le constructeur est "final". Une variable locale constante est "final". Un paramètre de fonction qui ne peut pas être réaffecté est "final". Cela permet au compilateur de vérifier après modification qu'on ne réaffecte pas une variable par erreur. 

Ajouter également le décorateur "@Override" devant la fonction toString surchargée. Le compilateur vérifie alors qu'il s'agit vraiment d'une surcharge, et pas d'une faute de frappe (notamment si le nom change dans la classe parent).

Second programme

Ajouter une classe BonusAccount dérivant de Account qui a, comme propriété, de rajouter systématiquement 10% à chaque dépôt fait.

Nettoyage

Refactoriser le programme en isolant dans une interface BankAccount ce qui relève des propriétés d'un compte bancaire. Faire en sorte que Account et BonusAccount implémentent les méthodes décrites dans l'interface BankAccount.