PL2 04ClassesObjets2
PL2 04ClassesObjets2
(2ème partie)
dernière mise à jour 10/01/2023 23:04
Philippe Genoud
[email protected]
Constantes
Le main()
Initialiseur statique
Finalisation
Rôled'un constructeur
effectuer certaines initialisations nécessaires pour le nouvel objet créé.
Ou un constructeur par défaut sans arguments et qui n'effectue aucune initialisation particulière est
invoqué
* on comprendra mieux cela lorsque l'on parlera de l'héritage et de l'invocation automatique des constructeurs de la super-classe
// constructeurs
public
private Point(double x, double y) { Constructeur privé uniquement
this.x = x; accessible dans la classe où il est
défini
this.y = y;
}
public Point(Point p) {
xthis(p.x,p.y);
= p.x; y = p.y;
}
public Point() {
xthis(0.0,0.0);
= 0.0; y= 0.0;
}
...
}
possiblede définir des méthodes possédant le même nom mais dont les arguments
diffèrent
des
méthodes surchargées peuvent avoir des types de retour différents mais à
condition qu'elles aient des arguments différents
/**
* ordonnée du point
*/
private double y;
...
/**
* Compare 2 points cartésiens
* @param p l'autre point
* @return true si les points sont égaux à 1.0e-5 près
*/
public boolean egale(Point p) {
double dx= x - p.x
double dy= y – p.y;
if(dx<0)
dx = -dx;
if(dy<0)
dy= - dy;
return (dx < 1.0e-5 && dy < 1.0e-5);
}
* En général on ne définit pas une méthode d’égalité de cette manière, ont
... préfère redéfinir la méthode equals(Object) , mais on en reparlera lors
} du cours sur l’héritage
Cette information ne concerne pas une instance particulière mais à l’ensemble des instances de Point
x 10 x 10 x 34
y 14 y 14 … y 17
Objet représentant la
Chaque instance possède une référence sur l’objet représentant sa classe classe Class
Point p1 = new Point(10,14); isa isa
System.out.println(p1.getClass().getName()); ----> Point name "Class"
... x 10 x 10 x 34
y 14 y 14 … y 17
Variable statique : private static double eps = 1.e-5; /** Compare 2 points cartésiens
* @param p l'autre point
variable de classe
* @return true si les points sont égaux à eps près
/** */
* abscisse du point public boolean egale(Point p) {
*/ double dx= x - p.x
private double x; double dy= y – p.y;
variables d’instances if(dx < 0)
/** dx = -dx;
* ordonnée du point if(dy < 0)
*/ dy= - dy;
private double y; return (dx < eps && dy < eps);
}
...
...
}
Appeler les méthode getEps et setEps ? private static double eps = 1.e-5;
...
Mais nécessité de passer par une instance de la classe Point
Point p = new Point (…);
System.out.println(p.getEps()); /**
p.setEps(1.e-8); * fixe imprécision pour tests d’égalité
* @param newEps valeur de l’imprécision
*/
public void setEps(double newEps) {
eps = newEps;
}
/*
* @return valeur imprécision
*/
public double getEps() {
return eps;
}
...
}
Comme pour les variables, possibilité d’associer des private static double eps = 1.e-5;
...
méthodes à un objet-classe en ajoutant le modifieur
static à sa déclaration méthodes statiques ou
méthode de classe /**
* fixe imprécision pour tests d’égalité
Méthodes statiques peuvent être invoquées sans * @param newEps valeur de l’imprécision
nécessité de passer par une instance de la classe, on y */
public void setEps(double newEps) {
accède directement par l’objet-classe qui peut être eps = newEps;
désigné par le nom de la classe } Les méthodes setEps et
getEps ne sont plus
System.out.println(Point.getEps()); /* associées aux instances de
Point.setEps(1.e-8); * @return valeur imprécision la classe Point mais à
*/ l’objet-classe Point
Méthode statique public double getEps() {
return eps;
désigne l’objet-classe représentant la classe Point
}
le nom de la classe est l’identificateur de la référence créée par défaut pour désigner l’objet-classe
...
Attention : à l’intérieur du corps d’une méthode statique il n’est }
Desconstantes nommées peuvent être définies par des variables de classe dont la valeur
ne peut être modifiée
public class Pixel {
Déclarations de variables de
public static final int MAX_X = 1024;
public static final int MAX_Y = 768;
classe
// variables d'instance
private int x; Le modifieur final est utilisé pour
private int y;
indiquer que la valeur d'une variable
...
// constructeurs (ici de classe) ne peut jamais être
changée
// crée un Pixel de coordonnées x,y
public Pixel()
{
...
}
...
}
NomDeLaClasse.nomDeLaMéthode(liste de paramètres)
n'est pas conditionné par l'existence d'instances de la classe,
Math.PI Math.cos(x) Math.toRadians(90) ...
System.out.println("COUCOU");
Classe System
du package java.lang
Variable de classe
(référence un objet de type
PrintStream)
Méthode d ’instance de
la classe PrintStream
du package java.io
nombre d ’arguments : 3
java TestArgs arg1 20 35.0 argument 0 : arg1
argument 1 : 20
argument 2 : 35.0
MaClasse1.java
public class MaClasse3 {
... _main
java MaClasse1
...
MaClasse2.java
public class MaClasse2 { MaClasse1.class
... public static void
main(String[] args) {
java MaClasse3
MaClasse3.java ...
}
public class MaClasse1 {
... }
MaClasse2.class
javac
public static void }
main(String[] args) {
...
_main
} ...
MaClasse3.class
les variables d'instance et de classe peuvent avoir des "initialiseurs" associés à leur
déclaration modifieurs type nomDeVariable = expression ;
private double x = 10;
private double y = x + 2;
private double z = Math.cos(Math.PI / 2);
private static int nbPoints = 0;
peut
être moins efficace que gestion explicite de la mémoire , mais programmation
beaucoup plus simple et sure.
"ramasse miettes" gère automatiquement ressources mémoire utilisées par les objets
un objet peut parfois détenir d'autres ressources (descripteurs de fichiers, sockets....) qu'il
faut libérer lorsque l'objet est détruit.
méthode dite de "finalisation" prévue à cet effet
permet de fermer les fichiers ouverts, terminer les connexions réseau... avant la destruction des objets
la méthode de "finalisation" :
méthode d'instance
doit être appelée finalize()
est invoquée juste avant que le "ramasse miette" ne récupère l'espace mémoire associé à l'objet
JAVA ne donne aucune garantie sur quand et dans quel ordre la récupération de la mémoire
sera effectuée,
impossible de faire des suppositions sur l'ordre dans lequel les méthodes de finalisation seront invoquées.
il vaut mieux éviter de définir et de compter sur des "finaliseurs" pour libérer des ressources critiques