Constructeurs H Batatia
Variable statique Une variable statique est partagée par tous les objets d’une classe
Exemple class Fraction{ int n;//numérateur int d;//dénominateur static String type; //type de nombre void setN(int x) { n = x}; void setD(int x) { d = x}; void getN() {return n}; void getD() {return d}; static String getType(){ return type; } class T { public static void main(String [] s){ new Fraction(); Fraction.type = "Rationnel; String s = Fraction.getType(); Fraction.n = 100; //erreur }
Exemple class Fraction{ int n;//numérateur int d;//dénominateur static String type; //type de nombre void setN(int x) { n = x}; void setD(int x) { d = x}; void getN() {return n}; void getD() {return d}; static String getType(){ return type; } class T { public static void main(String [] s){ Fraction var = new Fraction(); var.type = "Rationnel; String s = var.getType(); var.n = 1; var.d = 2; }
De multiples objets Ecrire la classe Rationnel dont la méthode main crée les objets fractions : ½, 1/3, …, 1/10 Et afficher leurs états
Exemple class Rationnel { public static void main(String [] s){ Fraction f for(int i=2; i<11; i++){ f = new Fraction(); f.setN(1); f.setD(i); System.out.println( "("+ f.getN() + "/" + f.getD()+ ")"); }
Exercice Ajouter à Fraction la méthode Public String Chaine() qui retourne la chaine (n/d)
Exemple class Fraction{ int n;//numérateur int d;//dénominateur void setN(int x) { n = x}; void setD(int x) { d = x}; void getN() {return n}; void getD() {return d}; public String chaine(){ return "(" + n + "/" + d + ")" ; }
Exercice Modifier la classe Rationnel pour utiliser la méthode chaine() pour afficher l’état des fractions
suite class Rationnel { public static void main(String [] s){ Fraction f for(int i=2; i<11; i++){ f = new Fraction(); f.setN(1); f.setD(i); System.out.println( f.chaine()); }
Exercice Modifier la classe Rationnel pour créer les objets ½, -1/3, ¼, -1/5, 1/6, -1/7, 1/8, -1/9, 1/10
suite class Rationnel { public static void main(String [] s){ Fraction f for(int i=2; i<11; i++){ f = new Fraction(); int x = (i%2 == 0?1:-1); f.setN(x); f.setD(i); System.out.println( f.chaine()); }
this Dans le corps d'un objet this désigne la référence à ce même objet Modifier la méthode chaine pour utiliser this
Référence this class Fraction{ int n;//numérateur int d;//dénominateur void setN(int x) { n = x}; void setD(int x) { d = x}; void getN() {return n}; void getD() {return d}; public String chaine(){ return "(" + this.n + "/" + this.d + ")" ; }
Méthodes get et set L'accès des attributs privés doit se faire à l'aide de méthodes publiques public type getAttribut(){ return this.attribut; } public void setAttribut(type v) { this.attribut = v; }
Exercice Ajouter à la classe Fraction, la méthode public Fraction add(Fraction f) qui crée la fraction somme de la fraction courante et la fraction f.
Référence this class Fraction{ int n;//numérateur int d;//dénominateur void setN(int x) { n = x}; void setD(int x) { d = x}; void getN() {return n}; void getD() {return d}; public String chaine(){ return "(" + this.n + "/" + this.d + ")" ; } public Fraction add(Fraction f){ int x = this.getN() * f.getD() + this.getD() * f.getN(); int y= this.getD() * f.getD(); Fraction r = new Fraction(); r.setN(x); r.setD(y); return r; }
Exercice Modifier la classe Rationnel pour afficher la somme de toutes les fractions créées
suite class Rationnel { public static void main(String [] s){ Fraction f ; Fraction r=null; for(int i=2; i<11; i++){ f = new Fraction(); int x = (i%2 == 0?1:-1); f.setN(x); f.setD(i); System.out.print( f.chaine() + " + "); if(r != null){ r = f.add(r); }else{ r = f; } System.out.println( "= " + r.chaine()); }
Constructeur L'instanciation de la classe Fraction se fait par new Fraction(); Dans cette instruction Fraction() est un constructeur D'une manière générale, un constructeur –est une méthode qui porte le nom de la classe; peut prendre des paramètres; ne retourne aucune valeur –sa déclaration prend la forme Classe (paramètres) {…} –peut être précédée d'un modificateur de visibilité (public, …) –son corps peut comprendre n'importe quel traitement –généralement, on l'utilise pour initialiser les attributs de l'objet
constructeur import es.*; class Fraction{ private int n;//numérateur private int d;//dénominateur Fraction(int x, int y){ this.n = x; this.d = y; } …. } class T { public static void main(String [] s){ Fraction f = new Fraction(1,2); String s = f.chaine(); System.out.println(s); }
Exercice Modifier les classes Fraction et Rationnel pour utiliser le constructeur de Fraction
suite class Fraction{ int n;//numérateur int d;//dénominateur void setN(int x) { n = x}; void setD(int x) { d = x}; void getN() {return n}; void getD() {return d}; public String chaine(){ return "(" + this.n + "/" + this.d + ")" ; } public Fraction add(Fraction f){ int x = this.getN() * f.getD() + this.getD() * f.getN(); int y= this.getD() * f.getD(); Fraction r = new Fraction(x,y); return r; }
suite class Rationnel { public static void main(String [] s){ Fraction f for(int i=2; i<11; i++){ f = new Fraction((i%2 == 0?1:-1), i); System.out.println( f.chaine()); }
Multiples Constructeurs Dans une classe, on peut créer de multiples constructeurs –ils ont tous le même nom (nom de la classe) –ils doivent avoir des paramètres différents –ils seront différenciés par le type de leurs paramètres
Exemple class Fraction { private int n; private int d; public Fraction( ){ this.n=0; this.d= 1; } public Fraction( int x){ this.n= x; this.d= 1; } public Fraction(int x, int y){ this.n= x; this.d= y; } public String chaine(){ return ( "Fraction: (" + this.n + "/" + this.d + ")"); } class T { public static void main(String [] s){ Fraction var1 = new Fraction (); System.out.println (var1.chaine()); Fraction var2 = new Fraction (5); System.out.println (var2.chaine()); Fraction var3 = new Fraction (5, 10); System.out.println (var3.chaine()); }
this() Dans le corps d'un constructeur, on peut appeler un autre constructeur de la même classe Pour cela, on doit utiliser this()
Exemple (15) class F { private int n; private int d; public Fraction( ){ this(0,1); } public Fraction( int x){ this(x,1); } public Fraction(int x, int y){ this.n= x; this.d= y; } public String chaine(){ return ( "Fraction: (" + this.n + "/" + this.d + ")"); } class T { public static void main(String [] s){ Fraction var1 = new Fraction (); System.out.println (var1.chaine()); Fraction var2 = new Fraction (5); System.out.println (var2.chaine()); Fraction var3 = new Fraction (5, 10); System.out.println (var3.chaine()); }
Constructeur par défaut Si aucun constructeur n'a été programmé, JAVA utilise un constructeur par défaut sans paramètres Si des constructeurs sont créés, le programmeur ne peut utiliser que ceux-la –c'est à dire que si on ne programme que des constructeurs avec paramètres, on ne peut plus appeler le constructeur sans paramètres (on peut néanmoins le programmer)
Exemple class F { private int n; private int d; public Fraction(int x, int y){ this.n= x; this.d= y; } public String chaine(){ return ( "Fraction: (" + this.n + "/" + this.d + ")"); } class T { public static void main(String [] s){ //erreur Fraction var1 = new Fraction (); System.out.println (var1.chaine()); //erreur Fraction var2 = new Fraction (5); System.out.println (var2.chaine()); Fraction var3 = new Fraction (5, 10); System.out.println (var3.chaine()); }
Où sont passés les objets? import es.*; class Fraction{ private int n;//numérateur private int d;//dénominateur Fraction(int x, int y){ this.n = x; this.d = y; } void setN(int x) { this.n = x;} void setD(int x) { this.n = x;} public String chaine(){ return ( "Fraction: (" + this.n + "/" + this.d + ")"); } class T { public static void main(String [] s){ Fraction f; f = new Fraction(1,2); String s = f.chaine(); Ecran.ecrireLigne(s); f = new Fraction(1,3); String s = f.chaine(); Ecran.ecrireLigne(s); } f n=1 d=2 n=1 d=3 …
Ramasse miettes Un programme de la JVM qui se charge de ramasser les zones mémoires correspondant aux objets n'ayant aucune référence Ces zones seront recyclées Ce programme s'appelle aussi Garbage Collector
Exercice On se propose de programmer une application permettant de simuler le fonctionnement d'un contrôleur de pression des 4 pneus d'une voiture. Celles-ci doivent être entre % à l'avant, et entre % à l'arrière. Le programme doit lire les 4 pressions depuis le clavier et afficher un diagnostic montrant l'état de chaque pneu : –normal, surgonflé, sous-gonflé –la pression nécessaire à ajouter (positive) ou retrancher (négative) Le programme doit aussi vérifier l'équilibre gauche- droite. La différence entre les pressions à gauche et à droite doit être au plus 3%. Représenter puis Ecrire les classes nécessaires