Classes abstraites, interface Classe interne Classes enveloppes 13 Conception par objets Classes abstraites, interface Classe interne Classes enveloppes Cours 13 Cours 13
Plan Classe abstraite Interface Classe interne Classes enveloppes Classe Double Cours 13 Cours 13
Classe abstraite Dans une classe abstraite certaines méthodes sont seulement déclarées : leur corps n’est pas précisé. Ces méthodes là doivent alors être déclarées abstract et leur définition doit être effectuée dans les classes dérivées. Toute classe contenant des méthodes abstraites doit, elle aussi, être déclarée abstract. Une classe abstraite ne peut être instanciée. Cours 13 Cours 13
Objectifs Constituer un « réservoir d’héritage » : méthodes et variables communes. Imposer à l’utilisateur de définir le corps des méthodes abstraites (donc imposer un mode d’emploi). Conséquence : Instancier une classe abstraite n’a pas de sens, d’où l’interdiction. Cours 13 Cours 13
On impose à l’utilisateur de redéfinir afficher() import java.awt.Color; Exemple abstract class Figures { int x, y; // Coin supérieur gauche du rectangle circonscrit int width, height; // Largeur, hauteur du rectangle circonscrit boolean visible; Color couleurTracé; Color couleurFond; static int nbDeFigures = 0; Figures(int x, int y, int largeur, int hauteur) { this.x = x; this.y = y; this.width = largeur; this.height = hauteur; couleurTracé = Color.black; couleurFond = Color.pink; visible = false; nbDeFigures++; } abstract void afficher(); } On impose à l’utilisateur de redéfinir afficher() Cours 13 Cours 13
Interface Sorte de classe qui ne contient que des méthodes abstraites et des variables static et final. Se déclare comme une classe en remplaçant le mot class par interface. Peut être incorporée dans une classe grâce au mot clé implements. La classe doit alors définir toutes les méthodes déclarées dans l'interface sinon, la classe est considérée comme abstraite. Toutes les méthodes redéfinies doivent être déclarées public explicitement car les méthodes d'une interface sont toujours publiques. final = constante Cours 13 Cours 13
Une classe peut implémenter plusieurs interfaces. Une interface peut être étendue grâce à extends, on crée une nouvelle interface. On peut dire qu'une classe qui implémente une interface se comporte comme l'interface. Imposer l’implémentation d’une interface dans une classe, c’est définir « le mode d’emploi » de la classe. C'est contraindre son utilisateur à obéir à un certain protocole. Cours 13 Cours 13
class A implements Inter { int x ; A() {} A(int x) {this.x = x; } interface Inter { static final double PI = 3.14; void lire(); void afficher(); } //------------------------------------------------------------------------ class A implements Inter { int x ; A() {} A(int x) {this.x = x; } public void lire() { } // public obligatoire public void afficher( ) {System.out.println("Bonjour, x vaut "+x);} } Cours 13 Cours 13
Classe interne Une classe interne est définie à l'intérieur d'une autre classe. Un objet d'une classe interne peut accéder à l'implémentation de l'objet qui l'a créé y compris aux données privées. Les classes internes peuvent être cachées aux autres classes du même package. Les classes internes anonymes sont utiles pour définir des appels de méthodes pour la gestion d’événements à la volée. Les classes internes sont traduites par le compilateur en fichiers portant le nom de la classe mère suivi d'un $ et du nom de la classe interne. Exemple : MaFen$Ecouteur.class. Cours 13 Cours 13
Classes enveloppes Une variable d’un type primitif int, … n’est pas un objet. Les classes enveloppes sont destinées à encapsuler ces variables là dans des objets. C’est pourquoi, c’est là que l’on trouve les méthodes de conversion. Classes Byte, Short, Integer, Long, Float, Double, Boolean, Void, BigInteger, BigDecimal. Cours 13 Cours 13
La classe Double Double(double valeur) Double(String s) Constructeurs Construit un objet de classe Double. Attention au grand « D » Cours 13 Cours 13
Comparaisons boolean isInfinite() static boolean isInfinite(double d) int compareTo(Double unAutreDouble) Renvoie : 0 si égal, négatif si int < unAutreDouble, positif sinon boolean isInfinite() static boolean isInfinite(double d) boolean isNaN() static boolean isNaN(double d) NaN = not a Number Cours 13 Cours 13
Cast de de la valeur d’un objet de classe Double en … Conversions : cast Cast de de la valeur d’un objet de classe Double en … byte byteValue() double doubleValue() float floatValue() int intValue() long longValue() short shortValue() static longBitsToDouble(long bits) (binaire) Cours 13 Cours 13
Conversion en String, Double ou double String toString() static String toString(double d) Conversion en chaîne d’un objet Conversion en chaîne d’un nb static Double valueOf(String s) throws NumberFormatException Génère un objet Double ayant la valeur de la chaîne Diffuse éventuellement une exception vers le bloc appelant static double parseDouble(String s) parse = analyse Génère un nombre double Cours 13 Cours 13
Champs static final double Constantes Champs static final double MAX_VALUE MIN_VALUE NEGATIVE_INFINITY POSITIVE_INFINITY NaN (Not a Number) Exemple : Double. MAX_VALUE Cours 13 Cours 13
Exemple : conversion d’une chaîne en type primitif double double z1, z2; // Ici on ne gère pas l'exception, elle est éventuellement diffusée z1 = Double.parseDouble("12345"); // Là, on récupère l'exception try { z2 = Double.parseDouble("12A345"); } catch(NumberFormatException e) { System.out.println("La chaîne n'est pas un double"); Cours 13 Cours 13
Exemple : conversion d’une chaîne en objet Double Double d1, d2; // Ici on ne gère pas l'exception, elle est éventuellement diffusée d1 = Double.valueOf("123.45"); // Là, on récupère l'exception try { d2 = Double.valueOf("12A345"); } catch(NumberFormatException e) { System.out.println("La chaîne n'est pas un double"); Cours 13 Cours 13