Les classes sont plus qu’un simple assemblage de champs comme le sont les structures en C, mais sont composées de membres qui caractérisent à la fois l’état (par les champs) et le comportement (par les méthodes) d’une famille d’objets.
De plus, les mots-clés private et public permettent de régler la visibilité, c’est-à-dire, l’accès, par des objets tiers, aux membres des objets d’une classe.
Les membres déclarés privés d’un objet ne sont accessibles que par les objets de la même classe. Au contraire, les membres déclarés publics d’un objet sont accessibles par n’importe quel objet client.
class Point {
public double x, y;
}
class DemoPoint {
public static void main(String[] args) {
Point p = new Point();
p.x = 2.0;
p.y = 5.0;
System.out.println("("+p.x+","+p.y+")");
}
}
Si on considère qu’un point ne doit pas changer après sa création, exposer ses coordonnées n’est pas judicieux.
class Point {
private double x, y;
public Point(double unX, double unY) {
x = unX;
y = unY;
}
public String toString() {
return "("+x+","+y+")";
}
}
class DemoPoint {
public static void main(String[] args) {
Point p = new Point(2.0,5.0);
System.out.println(p); //on lui demande de s'afficher
//equivalent à: System.out.println(p.toString());
}
}
Pour adresser une requête à un objet, une référence vers cet objet doit être disponible. Dans une classe, pour adresser une requête à soi-même, on utilise this.
Sans ambiguité, il n’est pas nécessaire. Sinon, il distingue les champs, des paramètres ou variables locaux:
public Point(double x, double y) {
this.x = x;
this.y = y;
}
Complétez le fichier Secteur.java décrivant la classe Secteur qui modélise un secteur angulaire, c’est-à-dire un intervalle connexe, borné par deux angles \([\theta_1,\theta_2[\), chacun dans \([0,2\pi]\). Par convention, le secteur est celui qu’on parcourt en partant de \(\theta_1\) dans le sens trigonométrique.
Testez avec le fichier TestSecteur.java.
NB. java.lang.Math.PI donne la valeur de \(\pi\) et % est l’opérateur modulo permettant de garantir des angles dans \([0,2\pi]\).
Les membres définis avec le mot-clé static, doivent être appelées, par une requête adressée directement à la classe (et non à une de ces instances). Cela est possible car les classes sont chargées en mémoire par la machine virtuelle (et vues comme les objets d’une meta-classe).
class Math {
...
public static final double PI = 3.141592653589793;
...
public static double cos( double a ) {
...
}
}
double x = Math.cos( Math.PI / 2.0 );//on n'a pas créé d'objet!
Le mot-clé static convient pour les
Dans votre classe modélisant un secteur angulaire:
- le secteur complet \([0;2\pi[\)
- le premier quadrant \([0;\pi/2[\)
- Testez leur écart dans TestSecteur.
Un objet peut en contenir d’autres via ses champs. La composition est la relation entre objets dans laquelle un objet est le champs du second.
Au sens fort, le champs est créé en même temps que l’objet, qui le possède.
Au sens faible (on parle dans ce cas plutôt d’agrégation), le champs réfère à un objet, indépendant de l’objet qui le connait.
Souvent les deux choix sont possibles et dépendent du contexte et des objectifs.
NB. java.lang.Math.abs() retourne la valeur absolue du nombre donné.
package tc.elp.java.geometry; //nom du package
public class Point { //nom strict de la classe
tc.elp.java.geometry.Point p; //déclaration d'une variable
A la compilation (resp. à l’exécution), les fichiers .java (resp. .class) sont recherchés sur le système de fichiers. Le classpath (option -classpath ou -cp) indique le répertoire à partir duquel ils sont cherchés (le répertoire courant par défaut). Depuis ce répertoire, le chemin donné par le nom strict de la classe, en remplaçant les points par des slash, mène au repertoire où ils doivent se trouver.
Dans notre exemple, le compilateur cherchera:
classpath /tc/elp/java/geometry/Point .java
A l’exécution, la machine virtuelle cherchera:
classpath /tc/elp/java/geometry/Point .class
Ce mécanisme de nommage permet d’éviter les conflits de noms, mais les noms de classe sont déraisonnablement longs:
tc.elp.java.geometry.Point p =
new tc.elp.java.geometry.Point(2.0,5.0);
Il est possible de raccourcir localement (dans un fichier source) le nom des classes en utilisant le mot-clef import au début des fichiers sources.
import tc.elp.java.geometry.Point;
//'Point', alias de 'tc.elp.java.geometry.Point' ci-dessous
...
Point p = new Point(2,5);