Created: 20123-01-16 Mon 16:58
Un programme est constitué de données et de fonctions manipulant les données. Les classes sont composées de données et de méthodes qui manipulent les données.
En Java, tout le code est implémenté sous forme de classes !
Les packages permettent d'organiser les classes (c'est l'équivalent des répertoires pour des fichiers).
On peut utiliser un nom complet qualifié (fully qualified name)
java.util.Scanner sc = new Scanner(System.in);
ou utiliser des directives import
: import
java.util.Scanner
ou java.util.*
en début de fichier.
import
spécifique, qui avec un
import
de tout le contenu d'un package.On parle d' Encapsulation.
On minimise ce qui est visible : il n'y a pas de dépendance envers ce qui n'est pas visible (→ possibilités d'évolutions).
Les différents niveaux de visibilité indiquent quel code a accès à ce qui est qualifié :
qualificatif | Classe | Package | Sous-classe | Tout |
---|---|---|---|---|
private |
✓ | |||
public |
✓ | ✓ | ✓ | ✓ |
protected |
✓ | ✓ | ✓ | |
✓ | ✓ |
(sous-classe → héritage)
MaClasse
sans qualificatif de visibilité dans un
package fr.formation.test
avec une fonction :static void message(){ System.out.println("Message depuis MaClasse !"); }
Main
dans un package fr.formation.test
avec une
fonction public static void main(String[] args)
qui essaie
d'appeler MaClasse.message()
.Main
est dans un package fr.formation.test
?
Quelle(s) modification(s) faut-il faire ?static
Ce qui est qualifié de static
concerne la classe (n'est pas créé en
cours d'exécution). Cf. public static void main(String[] args)
.
On classe possède des données appelées attributs. Celle-ci sont accessibles, selon leur visibilité, comme des variables avec une durée de vie qui est celle du programme. On accède à un attribut d'une classe comme à une fonction (méthode) de classe :
System.out;
Integer.MIN_VALUE;
En fait, pour limiter le couplage on utilise généralement des attributs de classe qui sont déclarés constants :
public static final int NOMBRE_ESSAIS= 5;
Dans la classe MaClasse
, ajouter un attribut de classe SALUT
de
type String
pour remplacer le mot "message"
de la classe MaClasse
.
Modifier la classe Quizz
pour que la fonction main
soit comme suit :
public static void main(String[] args){ for(int i=0; i != questions.length; ++i){ System.out.println(questions[i]); String answer= in.nextLine(); if(answer.equals(answers[i])){ score+= scores[i]; } } displayResult(); }
Lorsqu'on veut manipuler différentes valeurs pour un même type composé, on doit instancier la classe décrivant ce type :
public class TestItem { String question; String answer; int points; }
On utilise le mot-clé new
:
TestItem ti= new TestItem();
On initialise les attributs d'un objet à l'occasion de la construction d'un objet. Dans une méthode d'instance (et un constructeur) on peut accéder directement aux attributs de l'instance.
public class TestItem { public TestItem(String q, String a, int p){ question= q; answer= a; points= p; } }
this
On peut aussi préfixer notre attribut avec le mot-clé this
:
public class TestItem { public TestItem(String question, String answer, int points){ this.question= question; this.answer= answer; this.points= points; } }
Généralement, on ne permet pas l'accès direct aux attributs, mais l'on utilise si nécessaire des accesseurs : getter et setter :
public TypeOfXXX getXXX(){ return xxx; } public void setXXX( TypeOfXXX xxx ){ this.xxx= xxx; }
Une méthode d'instance (non qualifiée par static
) :
est appelée sur une instance
System.out.println();
str.equals("test");
On réimplémente (voir héritage et polymorphisme) généralement au moins les
méthodes equals et toString. Cette dernière est appellée
automatiquement lors d'une concaténation ou d'un affichage avec
println()
.
En fait, tous les objets sont manipulés par
références (comme les instances de String
, Integer
,…).
Cf. implications pour arguments, ==, …
Si tous les attributs d'instance sont constants, il n'y a pas de risques de modifications problématiques.
Modifier le programme Quizz
pour utiliser des objets d'une classe
TestItem
.
Utiliser une classe QuizzItem
immutable, avec une méthode qui
retourne le nombre de points obtenus en validant ou non une réponse
proposée.
Utiliser une classe QuizzItem
mutable avec un attribut qui permette
de reproposer la question en cas de réponse erronée.
Modifier la classe Quizz
pour que le main instancie un objet
paramétré par le nombre d'essais:
public static void main(String[] args){ Quizz session= new Quizz(nbRetries); session.doTest(); session.displayResults(); }
Réarchitecturer ("refactorer") le code de gestion de données sur les aliments avec une architecture Orientée Objet.