360 likes | 469 Vues
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};
E N D
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 formeClasse (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
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()); } } Exemple
this() • Dans le corps d'un constructeur, on peut appeler un autre constructeur de la même classe • Pour cela, on doit utiliser this()
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()); } } Exemple (15)
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)
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()); } } Exemple
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 2.2+-10% à l'avant, et entre 2.0 +-10% à 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