Programmation en Java - TD4 M1 ISIFAR 2008 2009 Révisions et héritage Exercice 1. Toute réponse doit être justifiée. Vous proposerez une correction lorsque le code n est pas correct. 1. Le code suivant est-il correct? class A{ private String nom; class B{ private A mona; B(String s){ mona = new A(); mona.nom = s; 2. La méthode suivante de la classe A doit-elle être statique ou dynamique? boolean memeensemble(char a, char b){ if ( a == b%4 ) return true; return false; 3. Le code suivant est-il correct? class C extends B{ private int nb; C(String s, int a){ this.nb = a; super(s); 4. On ajoute à la classe B, la méthode public void affiche(). Le code suivant est-il correct? int main(string []args){ B monb; switch(args[0]){ case "B": monb = new B("Bonjour"); break; case "C": monb = new C("Bonjour", 15); break; monb.affiche();
5. On ajoute à la classe C, la méthode void mult(int coeff){ nb *= coeff; et dans le main l instruction monb.mult(2); en dernière ligne. Le code obtenu est-il correct? Exercice 2. Qu affiche le programme suivant? Expliquez. private int val=0; public static void afficheplus(int a) { a++; System.out.println(a); public static void afficheplus(a a) { a.val++; System.out.println(a.val); public static void main(string[] args) { A uneclasse = new A(); A uneautreclasse = new A(); afficheplus (uneclasse.val); afficheplus (uneclasse.val); afficheplus (uneclasse); afficheplus (uneclasse); afficheplus (uneautreclasse); afficheplus (uneautreclasse); if (uneclasse == uneautreclasse) System.out.println("Egales"); else System.out.println("Differentes"); Exercice 3. Examinons le programme suivant : Fichier Figure.java public class Figure { double x, y ; public Figure() { x = 0 ; y = 0 ; public Figure(double x, double y) { this.x = x ; this.y = y ; public String tostring() { return "Position : (" + x + "," + y + ")" ; Fichier Cercle.java
public class Cercle extends Figure { final static double PI = 3.141592564 ; private double rayon ; public Cercle() { rayon = 0 ; public Cercle(double x, double y, double r) { super(x,y) ; rayon = r ; public String tostring() { return super.tostring() + " Rayon : " + rayon ; fichier TestFigure.java : public class TestFigure { public static void main(string[] args) { Cercle c1,c2 ; c1 = new Cercle(1,1,3) ; c2 = new Cercle() ; System.out.println(c1.toString() + "\n" + c2.tostring()) ; 1. De quelles variables d instance de Figure hérite la classe Cercle? 2. La variable rayon étant déclarée private, on ne peut pas la modifier de l extérieur de la classe. Ajoutez une méthode setrayon pour pouvoir le fixer et getrayon pour le lire. 3. Ajoutez une variable surface à la classe Cercle. Modifiez les méthodes setrayon et tostring en conséquence. Ajoutez les méthodes d accès à ce champ. On notera que le fait de protéger les variables par private et de restreindre leur accès à l utilisation de méthode permet de maintenir la cohérence d un état. 4. Écrivez une méthode c1.estplusgrand(cercle c2) renvoyant true si le cercle c1 est plus grand que c2. Comment écrire une méthode ayant un comportement similaire, mais prenant les deux cercles en argument? 5. Étendez la classe Cercle avec une classe Cylindre ajoutant une variable h pour la hauteur et une méthode volume. On ajoutera les constructeurs adéquats et on surchargera tostring en conséquence. 6. Étendez la classe Cercle avec une classe CercleDeCouleur. La classe Cylindre hérite-t elle de l attribut de coloration? Exercice 4. Les exemples suivants sont ils corrects? Justifiez. class Ex2a { int a ; Ex2a() { System.out.println(a) ; Ex2a(int a) { this() ;
class Ex2b { int a ; class Ex2b2 extends Ex2b { int b ; Ex2b2(int a,int b) { this.b = b ; class Ex2c { int a ; Ex2c(int a) { class Ex2c2 extends Ex2c { int b ; Ex2c2(int a,int b) { this.b = b ; class Ex2d { public int a ; Ex2d() { Ex2d(int a) { class Ex2d2 extends Ex2d { private int a ; int b ; Ex2d2(int a,int b) { this.b = b ; class Ex2e { public int a ; Ex2e(int a) { void seta(int c) { a=c ; class Ex2e2 extends Ex2e { private int a ; private Ex2e2(int a) { System.out.println("Hello") ; super(a) ;
private void seta(int c) { a=2*c ; Exercice 5. Pour chacune des classes demandées, vous écrirez une méthode tostring() renvoyant les caractéristiques de l objet sous forme de chaîne. Écrivez une classe Vehicule contenant un champ : private int nbpassager; dans laquelle vous définirez un constructeur Vehicule(int n) initialisant le nombre de passagers du véhicule, et une métode tostring retournant une chaîne de caractères indiquant le nombre de passager d un véhicule. Écrivez maintenant une classe Velo étendant la classe Véhicule contenant un champ : private int nbroues=2; mais pas de constructeur. Le programme compile-t-il? Justifiez votre réponse et proposez une solution le cas échéant. Écrivez maintenant une classe Avion étendant la classe Véhicule contenant un champ : private int nbmoteur; en utilisant les méthodes this et super, écrivez un constructeur Avion(int nbp) puis Avion(int nbp, nbm) initialisant le nombre nbp de passagers de l Avion et le nombre nbm de moteurs. Faites de même avec une classe Voiture et représentez la hiérarchie des classes sous forme d un arbre. Proposez un nouveau schéma permettant de mieux «classer» les classes Avion, Velo et Voiture et écrivez la/les classes suggérée(s). Exercice 6. Qu affiche le programme suivant? int i = 1 ; int f() { return i ; static char g() { return A ; class B extends A { int i = 2 ; int f () {return -i ; static char g() { return B ; public class Ex3 { public static void main(string args[]) { B b = new B() ; System.out.println(b.i) ; System.out.println(b.f()) ; System.out.println(b.g()) ; System.out.println(B.g()) ; A a = b ; System.out.println(a.i) ; System.out.println(a.f()) ; System.out.println(a.g()) ; System.out.println(A.g()) ;
Exercice 7. Dans l exemple suivant, si l on écrit dans B ((A)this).f(), quelle méthode est appelée? Que se passe-t-il avec ((A)this).i? int i = 1 ; int f() {return i ; class B extends A { int i = 2 ; int f() {return super.f() * 2 + i ; Exercice 8. On considère les définitions de classes suivantes : void f(a o) { System.out.println("void f(a o) dans A"); class B extends A { void f(a o) { System.out.println("void f(a o) dans B"); Qu affiche le fragment de programme suivant? A a = new A(); A ab = new B(); B b = new B(); a.f(a); a.f(ab); a.f(b); ab.f(a); ab.f(ab); ab.f(b); b.f(a); b.f(ab); b.f(b); Exercice 9. On ajoute maintenant à la classe B la méthode suivante : void f(b o) { System.out.println("void f(b o) dans B"); Est-ce une redéfinition ou une surcharge? Qu affiche alors le fragment de programme de l exercice 8? Exercice 10. On ajoute finalement à la classe A la méthode suivante : void f(b o) { System.out.println("void f(b o) dans A"); Est-ce une redéfinition ou une surcharge? Qu affiche alors le fragment de programme de l exercice 8?
Exercice 11. Qu affiche le fragment de programme suivant? System.out.println(a instanceof A); System.out.println(ab instanceof A); System.out.println(b instanceof A); System.out.println(a instanceof B); System.out.println(ab instanceof B); System.out.println(b instanceof B);