JAVA et l'orientation objet Jean-Jacques LE COZ Encapsulation L'encapsulation est le concept de masquer l'implémentation de la classe De ne permettre l'accès qu'à l'interface de la classe Réalisation Positionner la visibilité des membres ne faisant pas partie de l'interface à la valeur private ou protected Accès aux membres privés Java définit un standard pour l'accès aux membres données cachés par l'encapsulation Le standard JavaBean Méthodes d'accès Méthodes get et set dont la visibilité est public Méthodes is pour celles qui retournent un booléen Exemple d'encapsulation public class Personne { private String nom; private boolean celibataire = true; public Personne() {} public Personne(String nom) { this.setNom(nom); } public void setNom(String nom) { this.nom = nom; } public String getNom() { return this.nom; } } public boolean isCelibataire() { return celibataire; } public void setCelibataire(boolean situation) { this.celibataire = situation; } Visibilités Java Visibilité Classe Paquetage Sous-classe Le monde private oui non non non package oui oui non non protected oui oui oui non public oui oui oui oui Variables d'instance Ce sont les membres données avec la visibilité private ou protected Accessibles que via les méthodes set et get (standard JavaBean) Attention même privées les données membres sont toutefois visibles entre objets du même type Variables de classe Ce sont les données membres déclarées avec le mot réservé static Elles existent hors des instances Une variable de classe est partagée par toutes les instances private static String variable; Constantes Même concept que dans le langage C Définies avec le mot réservé final private final static String CONSTANTE= ''ABCD''; Méthodes de classe Ce sont les méthodes déclarées avec le mot réservé static Elles peuvent être invoquées hors l'existence d'une instance public class Maclasse { public static void methode() { System.out.println(''Bonjour''); } ... Maclasse.methode(); Constructeur Méthode spéciale Sans type retour Ayant toujours pour nom celui de la classe Une classe peut posséder plusieurs constructeurs surchargés Si pas de constructeur défini alors le langage offre le constructeur dit par défaut Exemple avec constructeurs public class Personne { private String nom; private String adresse; public Personne() {} public Personne(String nom) { this.nom = nom; } } public Personne(String nom, String adresse) { this.nom = nom; this.adresse = adresse; } Héritage et abstraction La relation « est un » ou « est une sorte de » IS-A relationship Basée sur la spécialisation et l'héritage Pas d'héritage multiple Implémentation Avec le mot réservé extends Pas de possibilité d'indiquer des règles d'héritage L'héritage correspond à l'héritage public du Exemple de spécialisation public class Animal { ... } public class Chat extends Animal { ... } Spécialisation Permet de définir un sous-type, une sous-classe avec le mot réservé extends Les classes définissent une hiérarchie dont la racine est la classe Object Le mécanisme d'héritage exclue l'héritage des constructeurs Le mot réservé super permet de faire référence à un membre de la sur-classe La méthode réservée super() permet de Racine hiérarchie Java Relation « a un » ou « a des » Si une classe possède une référence sur une autre classe on dit qu'elle a une relation « a un » HAS-A relationship public class Automobile { private Moteur moteur; ... } Exemple de HAS-A relation public class Automobile { private Moteur moteur; private Roue[ ] roues = new Roue[4] ; ... } Modèle de relation Interfaces Le langage Java implémente le concept d'interface Une interface est un contrat de comportement public Les classes qui implémentent une interface doivent en implémenter toutes les méthodes C'est le mot réservé implements qui permet de préciser qu'une classe implémente une interface Définition d'interface public interface Humain { final String GENRE_MASCULIN = ''MASCULIN''; final String GENRE_FEMININ = ''FEMININ''; public void marcher(); public void parler(); public void rire(); } Implémentation public class Personne implements Humain { ... public void marcher() { .... } public void parler() { ... } public void rire() { ... } ... } Utilisation d'interfaces Permet de masquer les vrais types des objets, notamment dans les collections Peut permettre le polymorphisme Isolation plus sûre qu'avec les classes abstraites Exemple public class CommunautéHumaine { private Humain[ ] collection = new Personne[100]; Principe d'isolation parfait A partir d'une interface Exposition du contrat de comportement Réaliser une implémentation par une classe abstraite Factorisation des données communes Factorisation des comportements communs Spécialisation par des classes concrètes Implémentation concrète Diagramme UML Polymorphisme Capacité des objets à réagir différemment au même message. Le comportement polymorphe est obtenu par des méthodes polymorphes. Le polymorphisme repose sur la dérivation de classes et/ou leur implémentation. Méthodes polymorphes Les méthodes polymorphes peuvent être abstraites dans les sur-classes et redéfinies dans les sous-classes concrètes. Les méthodes polymorphes peuvent avoir une implémentation par défaut dans les sur-classes et être redéfinies dans les sous-classes concrètes. Java et le polymorphisme Possible via les classes, les classes abstraites et les interfaces Le mécanisme de choix de la méthode à exécutée se fait lors du runtime Il faut prévenir le langage que le comportement polymorphe est attendu En attachant aux objets deux types Le type déclaré et le type inhérent Exemple UML Exemple Java Interface instancea = new ClasseA(); Interface instanceb = new ClasseB(); instancea.methode-polymorphe(); instanceb.methode-polymorphe(); Classe-abstraite instancec = new ClasseC(); Classe-abstraite instanced = new ClasseD(); instancec.methode-polymorphe(); instanced.methode-polymorphe(); Classes imbriquées Une classe imbriquée est une classe déclarée dans une autre classe Visibilités d'une classe imbriquée public ,private, protected Portées d'une classe imbriquée final, abstract, static Exemple public class Maclasse { private MaclasseImbriquee laclasse = new MaclasseImbriquee(); ... protected class MaclasseImbriquee { } } ... Collections Les collections sont essentielles en Java Elles couvrent un grand nombre de classes et d'interfaces Depuis Java 5 (Tiger) elles peuvent être paramétrées Par défaut elles contiennent des Object Phénomène d'aplatissement Il s'agit d'un véritable framework Collection, interfaces, classes Collection est l'interface racine Sous-interfaces : List, Set, Map Classes Implémentation de List Implémentation de Set ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet Implémentation de Map HashMap, HashTable, TreeMap, LinkedHashMap Implémentation de List Quand la collection ne nécessite pas d'être synchronisée il faut préférer la classe d'implémentation ArrayList Quand la collection nécessite d'être synchronisée et donc sûre au niveau des Threads il faut choisir la classe Vector Accès aux membres des collections Avec l'implémentation Java du Design Pattern Iterator Avec la nouveauté Java 5: for Exemple ... Iterator it = communautéHumaine.iterator(); while(it.hasNext()) { Humain courant = (Humain) it.next(); System.out.println((courant.parler()); } ... Collections typées A l'aide des Generics Nouveauté java 5 Syntaxe Collection<Humain> communauté; communauté = new ArrayList<Humain>(); Nouvautés Java 5 public class Exemple { private Collection<String> collection = new ArrayList<String>(); ... public boolean rechercher(String argument) { for(String instance : collection) if(instance.equals(argument)) return true; } return false; Dates Classes pour manipuler les dates Calendar DateFormat SimpleDateformat DateFormatSymbols Création d'une instance de Date Date ladate = new Date(); Date ladate = new Date(System.currentTimeMillis()); Références The Java Language Specification, Gosling, J., Joy, B., and Steele, G. Addison-Wesley, 2000, ISBN 0-201-31008-2 Java in a Nutshell, Flanagan, D. O'Reilly & Associates, 1999, ISBN 156592-487-8 Core Java 2, Volume I - Fundamentals, Horstmann, C.S. and Cornell, G. Prentice Hall, 1999, ISBN 0-13-081933-6 Core Java 2, Volume II - Advanced Features, Horstmann, C.S. and Cornell, G. Prentice Hall, 2000, ISBN 0-13-081934-4 Sun Microsystem's Java tutorial