Nous allons maintenant nous focaliser sur l'écriture des classes et aborder:
private
, public
),this
,static
,package
, import
).private
, public
§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());
}
}
this
§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
Math.cos()
).Math.PI
). Dans ce cas on fait suivre le mot-clé final à static
.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.
Point
précédente.Cercle
modélisant un cercle défini par un centre et un rayon, obligatoirement positif.ArcCercle
modélisant un arc de cercle, défini par un cercle et un secteur angulaire.toString
qui retourne une description textuelle de
l'objet courant.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
package
permet d'ajouter une classe à un regroupement.
Son nom est composé; chaque partie étant séparée par des points.
Il doit être déclaré en haut du fichier source de la classe
(un package anonyme est créé par défaut).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);
ExempleNommage
, ajoutez la hiérarchie
de répertoires tc/elp/java/geometry
. Dans geometry
, ajoutez
les fichiers sources des classes Point
, Secteur
, Cercle
,
ArcCercle
.package
pour que ces classes appartiennent toutes au package
tc.elp.java.geometry
.ExempleNommage
, ajoutez la classe DemoArcCercle
qui affiche
le premier quadrant d'un cercle centré en l'origine et de rayon 5 (elle
n'appartient pas au même package).ExempleNommage
, créez un répertoire build
, puis
compilez avec javac tc/elp/java/geometry/*.java DemoArcCercle.java -d build
.
Que se passe-t-il ? La classe ArcCercle est-elle publique ? Sinon,
précédez la déclaration de la classe par le mot-clé public
.java -cp build/ DemoArcCercle
.Mot-clé | Package | Tous |
---|---|---|
public | O | O |
aucun | O | N |
Mot-clé | Classe | Package | Tous |
---|---|---|---|
public | O | O | O |
aucun | O | O | N |
private | O | N | N |
this
,private
, public
,static
,package
, import
.