Java-2-Core

publicité
JAVA
Le cœur du langage
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA20
Programmation Objet : Objectifs
• Simplifier
– Code plus lisible
– Code facilement maintenable
– Code plus « humain »
• Organiser
– Développement
– Suivit
==> Projets Mieux Gérés ==> Gains
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA21
Classes et Objet
• En java tout est objet
• Tout objet est défini par une classe
• Classe = Type
• Objet = Instance du type
• Guitare c;
• c=new Guitare("Fender");
c
Stéphane Frénot - [email protected] - Dpt Télécommunications
"Fender"
IJA22
Objets
• Morceau de programme identifié par
– Ses Attributs
• Représentés par des variables déclarée dans l'objet
• Représentent un état de l'objet
listeCours()
– Ses méthodes
• fonctions auxquelles l'objet sait répondre
• Représentent un comportement de l'objet
• Objet Eleve durand ?
• Objet Connexion uneConnexion ?
180 m
80 kg
"Jean"
getAge()
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA23
Classes
•
•
•
•
Usine de fabrication d'objets
Outil du programmeur
Permet de définir le comportement des objets
Prennent la Première lettre en majuscule
• Classe Elève
• Classe Connexion
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA24
Création d'un objet
• Pour manipuler un objet, on déclare une référence sur la
classe de cet objet :
Circle c;
• Pour créer un objet, on instancie une classe en appliquant
l'opérateur new sur un de ses constructeurs. Une nouvelle
instance de cette classe est alors allouée en mémoire :
c = new Circle();
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA25
Constructeur
• Tout objet doit avoir ses valeurs initiales
positionnées. Un constructeur permet de fixer ces
valeurs à la création de l'objet
• Toute classe possède un constructeur par défaut,
implicite. Il peut être redéfini. Une classe peut
avoir plusieurs constructeurs qui diffèrent par le
nombre et la nature de leurs paramètres.
• Un constructeur est une méthode qui possède le
même nom que la classe, mais qui ne renvoie rien
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA26
Création d'un objet
class Circle {
protected double x, y, r;
public Circle(double x, double y, double r) {
this.x = x; this.y = y; this.r = r;
}
public Circle(Circle c) {
this.x = c.getX(); y=c.getY(); r=c.getR();
}
public Circle() {
this(0.0, 0.0, 0.0);
}
public double getX(){return this.x;}
public double getY(){return this.y;}
public double getR(){return this.r;}
Circle(double x,
double y,
double z)
Circle(Circle c)
Circle()
2
3
10
getX()
getY()
getR()
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA27
Définition d'une classe
class Circle {
…
/*cf précédent*/
public int perimeter(){
return (Math.PI*2*r);
}
public int area(){
return (Math.PI*r*r);
}
}
Circle(double x,
double y,
double z)
Circle(Circle c)
Circle()
2
3
10
getX()
getY()
getR()
area()
perimetre()
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA28
Attributs et Variables
• Les attributs sont relatifs aux objets
– Ils sont définis dans la classe
• Les variables sont relatives à une méthode
– Elles sont définies dans une méthode
class Bidon {
protected Toto x;
public int calcul(){
int tmp=0;
while(tmp < CONST_X){
x=x.ajoute(tmp);
}
}
}
calcul()
x 0x123
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA29
Exercice
• Instancier un objet de la classe Patient, avec
comme nom durand et comme prénom paul
• Réaliser une classe de gestion de division
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA30
Instance et Classe : statique
• La classe est également vue comme un objet
• Les attributs et les méthodes statiques sont
associés à la classe
• Toutes les instances de la classe partagent la
valeur de attributs "static"
• Il n'est pas nécessaire d'instancier une classe
pour accéder à ses éléments statiques
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA31
Exemple du mot clé statique
public class Circle {
public static int count = 0;
public static double PI = 3.14;
protected double x, y, r;
public Circle(double r){this.r = r; count++;}
... /*cf ppt précédent*/
public static Circle bigger(Circle c1, Circle c2){
if (c1.r > c2.r) return c1; else return c2;
}
}
public class UneClasseExemple{
public UneClasseExemple(){
Circle c1 = new Circle(10);
Circle c2 = new Circle(20);
int n = Circle.count;
// n = 2
Circle c4 = Circle.bigger(c1, c2); // c4 = c2
}
}
bigger(Circle, Circle)
count 2
4
5
1000
getX()
getY()
getR() area()
perimetre()
2
3
10
getX()
getY()
getR() area()
perimetre()
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA32
Exercice
• Réaliser la classe Division avec des
méthodes statiques
• Comment lancer un programme ?
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA33
Enfin mon premier programme
public class HelloWorld {
public static void main(String [] arg){
System.out.println("Hello, World !");
}
}
main(String [] arg)
HelloWorld
HelloWorld.java
Compilateur
javac HelloWorld.java
HelloWorld
HelloWorld.class
Machine Virtuelle
java HelloWorld.java
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA34
Composition de classe
• Une classe est un agrégat d'attributs et de méthodes : les membres
• Principe de COMPOSITION
Patient
nom
prenom
String getNom()
String
Durand
String
Paul
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA35
D'où viennent les objets ?
• Les objets n'apparaissent que s'ils sont fabriqués
par quelque chose...
• Et qu'on a obtenu une référence dessus (statique,
récupération suite à un appel)
• SI ON N'A PAS UN OBJET, IL SUFFIT DE LE
FABRIQUER
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA36
D'où vient une classe ?
• Soit on l'a défini entièrement
• Soit on nous l'a fourni
• SI ON A BESOIN D'UNE CLASSE, IL SUFFIT
DE L'ECRIRE
• Java fournit plus de 10 000 classes dans le kit de
base (bibliothèque standard)
• La difficulté est d'en connaître leurs existences
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA37
Communication entre objets
• Les objets communiquent entre eux en s'échangeant
de messages
• Un message est un appel de fonction d'un objet vers
un autre : « Invoquer une méthode »
==> Unique manière de communiquer entre objets
getNom()
ListePatients
Patient
nom
prenom
String getNom()
0x234
Stéphane Frénot - [email protected] - Dpt Télécommunications
String
Durand
String
Paul
IJA38
Syntaxe d'un message
• <référenceDeL'objet>.<nomDuMessage>
class PaintShopPro {
Cercle leCercle=new Cercle(0,0,10);
public int uneFonction() {
int surface=leCercle.getArea();
return surface;
}
}
==> Quels sont les messages impliqués
==> Exercice : réaliser la classe Addition
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA39
Référence et this
• Pour pouvoir accéder à un objet il faut avoir une
référence dessus.
• La référence est le nom qu'on lui donne localement
• Si on veut se parler à soi-même on utilise « this »
class Cercle {
public void afficheToi() {
System.out.println(
"Je suis un cercle de surface"+this.getArea();
}
}
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA40
Méthodes static
• Les méthodes statiques peuvent elles
accéder à this ?
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA41
Message or Not Message
Vector tmp=new Vector();
tmp.addElement("10");
c.r = 3;
a = c.area();
pi = Math.PI;
b = Math.sqrt(2.0);
System.out.println("toto"+"titi");
System.out.println("Bonjour");
int a=2;
int b=3;
int c=a+b;
String toto="Hello,";
String titi="World!";
String tata=toto+titi;
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA42
Notion d'encapsulation
• La programmation objet permet de ne rendre
visible de l'extérieur que certaines parties de
l'objet
• L'utilisateur d'un objet n'accède qu'à sa partie
publique. L'autre partie est dite privée.
Partie publique
Partie
privée
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA43
Notion d'encapsulation
• Intérêts :
– Modification de la partie privée, tout en gardant la
même définition publique
– Masquer certains détails
• D'une manière générale
– Tous les attributs d'une classe sont "protected"
– Certaines méthodes sont "public" d'autres privées
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA44
Exemple
public class ClientWeb {
protected void connect(String unServer){
/* ouvrir une connexion reseau */
}
protected String getDocument(){
/* Demander au serveur la page */
}
public String getPageWeb(String server){
this.connect(server);
String tmp=this.getDocument();
return tmp;
}
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA45
Surcharge de méthode
• La surcharge (overloading) permet à plusieurs
méthodes ou constructeurs de partager le même
nom.
• Pour que deux méthodes soient en surcharge il faut
qu'elles aient le même nom, mais une signature
différente (paramètres de la fonction)
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA46
Surcharge exemple
class Point {
protected double x,y;
public Point (){ this.x=0.0; this.y=0.0;}
public Point (double x, double y){this.x=x; this.y=y}
//Calcule la distance entre moi et un autre point
public double distance(Point autre){
double dx=this.x-autre.getX();
double dy=this.y-autre.getY();
return Math.sqrt(dx*dx+dy*dy);
}
//Calcule la distance entre moi et une autre coordonnée
public double distance(double x, double y){
double dx=this.x-x;
double dy=this.y-y;
return Math.sqrt(dx*dx+dy*dy);
}
//Calcule la distance entre moi et une autre coordonnée
public double distance(int x, int y){
double dx=this.x-(double)x;
double dy=this.y-(double)y;
return Math.sqrt(dx*dx+dy*dy);
}
//Calcule la distance entre moi et l'origine
public double distance(){
return Math.sqrt(x*x+y*y);}}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA47
Surcharge exemple
• Appel
– Quand une méthode est appelée le nombre et le
type des arguments permettent de définir la
signature de la méthode qui sera invoquée.
Point p1=new Point();
Point p2=new Point(20.0, 30.0);
p2.distance(p1);
p2.distance(50.0, 60.0);
p2.distance(50, 60);
p2.distance();
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA48
Les types primitifs
• Types
–
–
–
–
–
–
–
–
byte : 1 octet
short : 2 octets
int : 4 octets
long : 8 octets
float : 4 octets
double : 8 octets
boolean : true false
char : 2 octets (Unicode)
• Ce ne sont pas des objets java. Donc … et Pourquoi ?
• Un type primitif ne prend pas de majuscule
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA49
Les types primitifs
• Les affectations non implicites doivent être castées
(sinon erreur à la compilation).
int i = 258;
long l = i;
byte b = i;
byte b = 258;
byte b = (byte)i;
//
//
//
//
ok
error: Explicit cast needed to convert int to byte
error: Explicit cast needed to convert int to byte
ok mais b = 2
• Pas de message sur un type primitif
– Définition de classes Wrapper : Integer
– Définition de fonctions de conversion
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA50
Les classes Wrapper
• Classes qui encapsulent un type de base
• ==> Permettre aux classes qui manipulent
des Objets de manipuler des types de base
• int i=4;
• Integer j=new Integer (4);
• Integer k=new Integer (i);
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA51
Les trois représentation d’un nombre
String.valueOf(k);
String k=«5»;
j.toString();
Integer j=new Integer(5);
Integer.toString(i);
j.intValue();
Integer.parseInt(k);
new Integer(i)
int i=5;
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA52
Passage de paramètres dans les méthodes
• Le mode de passage des paramètres dans les méthodes
dépend de la nature des paramètres :
– par référence pour les objets
– par copie pour les types primitifs
public class C {
void methode1(int i, StringBuffer s) { i++; s.append("d");}
void methode2() {
int i = 0;
StringBuffer s = new StringBuffer("abc");
methode1(i, s);
System.out.println("i=" + i + ", s=" + s); // i=0, s=abcd
}
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA53
Principes de base
• Aucune instruction en dehors d’une classe
• Tous la communication se fait par échange de
messages
public class MaClasse{
int i=12;
String toto="Bonjour";
public static void main(String [] arg){
MaClasse unRepresentant=new MaClasse();
System.out.println("Je dis : ");
System.out.println(unRepresentant.disBonjour());
}
public String disBonjour(){return toto;}
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA54
Résumé
•
•
•
•
•
•
Des objets, des classes pour fabriquer ces objets
Des attributs : soit des variables, soit des méthodes
L'encapsulation permet de masquer du code
Les membres static sont attachés à la classe
Seuls les types de base ne sont pas des objets
Les classes prennent leur première lettre en
Majuscule
• On ne travaille que sur des références d'objet sauf
pour les types de base
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA55
Un peu d'algorithmique Java
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA56
Bases du langage
• Types
–
–
–
–
–
–
–
–
byte : 1 octet
short : 2 octets
int : 4 octets
long : 8 octets
float : 4 octets
double : 8 octets
boolean : true false
char : 2 octets (Unicode)
• Instructions
• Opérateurs
– Arithmétique : =+-*/%
– Relationnels : <><= >= == !=
– Logiques : ! && ||
– Incréments : ++ -– Bit Wise : & | ^ ~ >> << >>>
– Affectation : = += -= *= /= %=
– if
– while, do while, for
– selection (switch)
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA57
Bloc de programmation
• { } n ’importe où, mais la plupart du temps
autour d’une classe ou d’une méthode
• Aucune instruction/déclaration hors d’un
bloc
• Une variable peut être déclarée n’importe
où dans un bloc. Elle possède la portée de
ce bloc
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA58
Les structures de contrôle et expression
• Essentiellement les mêmes qu'en C
– if, switch, for, while, do while
– ++, +=, &&, &, <<, ?:
• Fonctionnement du switch sur type primitif
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA59
Les tableaux
• Déclaration
int[] array_of_int; // équivalent à : int array_of_int[];
Color rgb_cube[][][];
• Création et initialisation
array_of_int = new int[42];
rgb_cube = new Color[256][256][256];
int[] primes = {1, 2, 3, 5, 7, 7+4};
array_of_int[0] = 3
• Utilisation
int l = array_of_int.length;// l = 42
int e = array_of_int[50];
// Lève une ArrayIndexOutOfBoundsException
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA60
Les exceptions (1)
• Elles permettent de séparer un bloc d'instructions de la
gestion des erreurs pouvant survenir dans ce bloc.
try {
// Code pouvant lever des IOException ou des SecurityException
}catch (IOException e) {
// Gestion des IOException et des sous-classes de IOException
}catch (Exception e){
// Gestion de toutes les autres exceptions
}finally{
// Dans tous les cas
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA61
Les exceptions (2)
• Ce sont des instances de classes dérivant de
java.lang.Exception
• La levée d'une exception provoque une remontée dans l'appel
des méthodes jusqu'à ce qu'un bloc catch acceptant cette
exception soit trouvé. Si aucun bloc catch n'est trouvé,
l'exception est capturée par l'interpréteur et le programme
s'arrête.
• L'appel à une méthode pouvant lever une exception doit :
– soit être contenu dans un bloc try/catch
– soit être situé dans une méthode propageant (throws) cette classe
d'exception
• Un bloc (optionnel) finally peut-être posé à la suite des
catch. Son contenu est exécuté après un catch ou après un
break, un continue ou un return dans le bloc try
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA62
Les exceptions (3)
class RobotLaveur {
void demarre() {
try {
uneMachineALaver.laver();
}
catch(PasDAssietteException e) {
...
}
catch(BrasCasseException e) {
...
}
finaly {
...
}
...
}
6
7
8
5
1
class MachineALaver {
void laver()
throws PasDAssietteException {
...
assiettesSales.depiler();
…
}
4
}
3
2
class PileSale{...
assiette depiler ()
throws PasDAssietteException {
if (pileVide()){
throw new PasDAssietteException(« fin de pile »);
}
return (Assiette)elemeentSuivant();
}
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA63
Les unités de compilation
• Le code source d'une classe est appelé unité
de compilation.
• Il est recommandé (mais pas imposé) de ne
mettre qu'une classe par unité de
compilation.
• L'unité de compilation (le fichier) doit avoir
le même nom que la classe qu'elle contient.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA64
Les packages définition
• Unité d'organisation des classes
– Organisation logique : time.clock.Watch
– Organisation physique : time/clock/Watch.class
• Espace de nommage hiérarchique
– Description de la hiérarchie : package time.clock;
– Notion de nom complet : time.clock.Watch
• Les bibliothèques java sont organisées en package
– java.util, java.net, org.objectweb,…
– Deux classes ayant le même nom complet ne peuvent pas
s'exécuter en même temps.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA65
Nom de classe : résolution
• Pour résoudre un nom de classe dans une autre classe
...
time.clock.Watch toto=new time.clock.Watch();
...
import time.clock.Watch;
...
Watch toto=new Watch();
...
import time.clock.*;
...
Watch toto=new Watch();
Clock titi=new Clock();
...
import time.*;
...
Watch toto=new Watch();
Clock titi=new Clock();
...
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA66
Nom de classe : résolution
• Pour résoudre le nom d'une classe soit :
– On donne son nom complet lors de l'utilisation
– On résout initialement son nom
– On résout initialement tous les noms d'un package
– Les noms des classes du package java.lang n'ont pas à
être résolus
• On peut donc avoir deux classes Date
java.util.Date
java.sql.Date
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA67
Les packages : organisation
graph/2D/Circle.java
package graph.2D;
public class Circle()
{ ... }
graph/3D/Sphere.java
package graph.3D;
public class Sphere()
{ ... }
paintShop/MainClass.java
package paintShop;
import graph.2D.*;
public class MainClass()
{
public static void main(String[] args) {
graph.2D.Circle c1 = new graph.2D.Circle(50)
Circle c2 = new Circle(70);
graph.3D.Sphere s1 = new graph.3D.Sphere(100);
Sphere s2 = new Sphere(40); // error: class paintShop.Sphere not found
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA68
Où trouver une classe ?
• Les outils du système cherchent toutes les classes
– Compilation et Exécution : typage fort C & E
– Les classes sont recherchées sur le système de fichiers
– Les classes standards sont automatiquement trouvées
par les outils
– Pour indiquer l'endroit sur le système de fichier à
partir duquel il faut chercher les classes on utilise le
classpath
– Fonctionnement identique au path d'exécution
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA69
Le classpath
• Il indique à partir de quel endroit recherche une classe
javac -classpath /usr/local titi.Toto.java
• La classe titi.Toto est recherchée à partir du répertoire
/usr/local /*Résolution physique*/
• Il faut donc que la classe soit définie dans le fichier :
/usr/local/titi/Toto.java /*Résolution java*/
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA70
Le classpath : le jar
• Un jar est une archive java
• Regroupement de fichiers dans un fichier
• Extension du système de fichiers
jar tvf toto.jar
tutu/
tutu/ours/
tutu/ours/Grumly.class
vi Test.java
package test;
import tutu.ours.Grumly;
public class Test {
Grumly toto=new Grumly();
}
javac ? ???
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA71
On revient sur la POO
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA72
Destruction d'un objet
• La destruction des objets est prise en charge par le
garbage collector (GC).
• Le GC détruit les objets pour lesquels il n'existe
plus de référence.
• Les destructions sont asynchrones (le GC est géré
dans une thread de basse priorité).
• Aucune garantie n'est apportée quant à la
destruction d'un objet.
• Si l'objet possède la méthode finalize, celle-ci est
appelée lorsque l'objet est détruit.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA73
Destruction d'un objet
public class Circle {
...
void finalize() { System.out.println("Je suis garbage collecte"); }
...
Circle c1;
if (condition) {
Circle c2 = new Circle(); // c2 référence une nouvelle instance
c1 = c2;
}
// La référence c2 n'est plus valide mais il reste une référence,c1,
// sur l'instance
c1=null; // L'instance ne possède plus de référence. Elle n'est plus
// accessible. A tout moment le gc peut détruire l'objet.
...
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA74
Classes et objets
public class Circle {
protected double x, y;
protected double r;
// Coordonnée du centre
// rayon du cercle
public Circle(double r) {this.r = r;}
public double area() {return 3.14159 * r * r;}
public void setX(int i){this.x=i;}
public void setY(int i){this.y=i;}
}
public class MonPremierProgramme() {
public static void main(String[] args) {
Circle c; // c, référence sur un objet Circle, mais pas encore un objet
c = new Circle(5.0); // c référence maintenant un objet alloué en mémoire
c.setX(10);
c.setY(10);
System.out.println("Aire de c :" + c.area());
}
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA75
L'héritage
• Objectifs :
– Organiser les classes dans une hiérarchie de
fonctionnement
– Les classes présentent dans ces relations d'héritage un
rapport parent / fils
– La relation d'héritage représente une relation
sémantique non standard entre le père et le fils
– Il n'existe pas de relation d'héritage universelle entre
les classes. C'est le rôle de l'architecte d'application
de définir la relation qu'il sous-entend
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA76
L'héritage syntaxe
public class Circle extends FormeGeométrique {
…
}
• La classe parente présente généralement soit
des fonctions générales à toutes les classes
filles, soit des fonctions types qui doivent
être (re)définie dans dans les classes filles
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA77
Héritage
• La relation d'héritage indique ce que l'objet est.
Object
FormesGraphiques
FormesEuclidiennes
Ellipse
Cercle
Trapeze
Rectangle
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA78
Sous-type
• Une sous-classe étend les capacités de sa
super classe. Elle hérite des capacités de sa
parente et y ajoute les siennes
• De plus une sous-classe est une
spécialisation de sa super-classe. Toute
instance de la sous-classe est une instance
de la super-classe (pas nécessairement
l'inverse).
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA79
L'héritage
•
•
•
•
==> Ce qu ’une classe EST
Une classe ne peut hériter (extends) que d'une seule classe.
Les classes dérivent, par défaut, de java.lang.Object
Une référence sur une classe C peut contenir des instances
de C ou des classes dérivées de C.
• L'opérateur instanceOf permet de déterminer la classe d'une
instance.
• Les classes final ne peuvent pas être redéfinies dans les
sous-classes.
• super et this pour accéder aux membres d’une classe
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA80
L'héritage
public class Ellipse {
public double r1, r2;
public Ellipse(double r1, double r2) { this.r1 = r1; this.r2 = r2;)
public double area{...}
}
final class Circle extends Ellipse {
public Circle(double r) {super(r, r);}
public double getRadius() {return r1;}
}
Ellipse e = new Ellipse(2.0, 4.0);
Circle c = new Circle(2.0);
System.out.println("Aire de e:" + e.area() + ", Aire de c:" + c.area());
System.out.println((e instanceOf Circle)); // false
System.out.println((e instanceOf Ellipse)); // true
System.out.println((c instanceOf Circle)); // true
System.out.println((c instanceOf Ellipse)); // true (car Circle dérive de Ellipse)
e = c;
System.out.println((e instanceOf Circle)); // true
System.out.println((e instanceOf Ellipse)); // true
int r = e.getRadius();// Error: method getRadius not found in class Ellipse
c = e;
// Error: Incompatible type for =. Explicit cast needed.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA81
Liaison dynamique de méthodes
• Liaison dynamique des méthodes (dynamic binding
of methods) : Indique que la méthode invoquée
n'est choisie qu'au dernier moment (run-time), et
non pas à la compilation.
• Différence entre Variable/Type et Objet/Classe :
– Une variable est un lieu de stockage ayant un type
associé. Ce type est déterminé à la compilation.
Déclaration statique.
– Un objet est une instance d'une classe. Son type est
déterminé quand l'objet est crée (à l'exécution).
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA82
Polymorphisme
• Dans les langages statiques, il faut que la partie
gauche(lhs) et droite (rhs) d'un assignement
soient de types compatibles
• Dans les langages objets, la partie droite droite
doit être d'un sous-type de la partie gauche.
class FormesGeometrique{…}
class Cercle extends FormesGeometrique{…}
class Rectangle extends FormesGeometrique{…}
FormesGeometrique forme1, forme2;
forme1=new Cercle();
forme2=new Rectangle();
Cercle forme3;
forme3=forme1; //Erreur de compilation forme1 de type FormesGeométrique
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA83
Le masquage des variables
• Une classe peut définir des variables portant le
même nom que celles de ses classes ancêtres.
• Une classe peut accéder aux attributs redéfinis de
sa classe mère en utilisant super ou par cast.
• Une classe peut accéder aux méthodes redéfinies
de sa classe mère en utilisant super.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA84
Le masquage des variables
class A {
int x;
void m() {...}
}
class B extends A{
int x;
void m() {...}
}
class C extends B {
int x, a;
void m() {...}
void test() {
a = super.x;
a = super.super.x;
a = ((B)this).x;
a = ((A)this).x;
super.m();
super.super.m();
((B)this).m();
}
}
//
//
//
//
//
//
//
a reçoit la valeur
Syntax error
a reçoit la valeur
a reçoit la valeur
Appel à la méthode
Syntax error
Appel à la méthode
de la variable x de la classe B
de la variable x de la classe B
de la variable x de la classe A
m de la classe B
m de la classe C (et non B)
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA85
Surcharge interdite : final
• Constantes
• Interdiction de surcharges
public static final int MAX=30;
protected final String toto="coucou";
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA86
Les classes abstraites
• Une classe abstraite est une classe ayant au
moins une méthode abstraite.
• Une méthode abstraite ne possède pas de
définition.
• Une classe abstraite ne peut pas être
instanciée (new).
• Une classe dérivée d'une classe abstraite ne
redéfinissant pas toutes les méthodes
abstraites est elle-même abstraite.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA87
Les classes abstraites
abstract class Shape {
public abstract double perimeter();
}
class Circle extends Shape {
...
public double perimeter() { return 2 * Math.PI * r ; }
}
class Rectangle extends Shape {
...
public double perimeter() { return 2 * (height + width); }
}
...
Shape[] shapes = {new Circle(2), new Rectangle(2,3), new
Circle(5)};
double sum_of_perimeters = 0;
for(int i=0; i<shapes.length; i++)
sum_of_perimeters = shapes[i].perimeter();
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA88
Les inner classes
• Introduites avec java 1.1
• Elles permettent de
– Déclarer une classe dans un bloc (inner class)
– Instancier une classes anonymes (anonymous class)
• Elles affinent la localisation des classes
• Elles simplifient le développement
• Elles offrent une (autre) réponse pour les pointeurs de
fonctions
• Elles sont une caractéristique du compilateur et non de la
JVM
• Attention : elles peuvent réduire la lisibilité des sources.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA89
Les inner classes
public class FixedStack {
Object array[];
int top = 0;
public
public
public
public
void push(Object item) { ... }
Object pop() { ...}
isEmpty() { ...}
java.util.Enumeration element() { return new Enumerator(); }
class Enumerator implements java.util.Enumeration {
int count = top;
public boolean hasMoreElements() { return count > 0; }
public Object nextElement() {
if (count == 0) throw NoSuchElementExceptio("FixedStack");
return array[--count];
}
}
}
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA90
Les interfaces (1)
• ==> Quels comportements une classe peut avoir en plus
de ce qu ’elle est
• Spécification formelle de classe
•
•
•
•
– Indique les services rendus par la classe qui implante
l'interface
!!! Technique / Conceptuel
Une interface correspond à une classe où toutes les
méthodes sont abstraites.
Une classe peut implémenter (implements) une ou plusieurs
interfaces tout en héritant (extends) d'une classe.
Une interface peut hériter (extends) de plusieurs interfaces.
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA91
Les interfaces (2)
abstract class Shape { public abstract double perimeter(); }
interface Drawable { public void draw(); }
class Circle extends Shape implements Drawable, Serializable {
public double perimeter() { return 2 * Math.PI * r ; }
public void draw() {...}
}
class Rectangle extends Shape implements Drawable, Serializable {
...
public double perimeter() { return 2 * (height + width); }
public void draw() {...}
}
...
Drawable[] drawables = {new Circle(2), new Rectangle(2,3), new
Circle(5)};
for(int i=0; i<drawables.length; i++)
drawables[i].draw();
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA92
Un langage oo
• Echange de messages (méthodes)
• Encapsulation
• Abstraction par les classes
– Composition, Héritage, Interfaces
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA93
Trucs & @stuches
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA94
Règles d'écriture de code Java
• Un fichier .java par classe
• Entête classique : description...
• Commentaires : JavaDoc
– Début de bloc : /** .... **/
– Balises : @author, @version, @see, @param, @return, @exception
• Exemple
/**
* Affiche un bouton rond
* <pre>
* BoutonRond b = new BoutonRond(titre);
* monPanel.add(b);
* </pre>
*@see awt.button
*@author C. Nicolas
**/
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA95
Convention de nommage
•
•
•
•
•
•
•
paquetages
classes
méthodes
constantes
variables/méthodes priv/protected
variables/méthodes statiques
variables locales à une méthode
•
•
•
•
méthodes fabriquant des objets de classe X
méthodes de conversion retournant des objets de type X
accesseur d'un attribut y de type X
accesseur de modification
•
•
•
classe de définition d'une exception
interface se distinguant d'une classe similaire
classe qui se distingue de son interface
minuscule
MajusulePourLaPremiereLettreDeChaqueMot
minusculePourLaPremiereCommeLaClasseAprès
MAJUSCULE_AVEC_SOULIGNE
termineParSouligne_
termineParDeuxSoulignes__
minuscules_avec_soulignes
newX
toX
X getY()
void setY(X valeur)
FinDeLaClasseAvecLeMotException
InterfaceSeTermineParIfc
ClasseSeTermineParImp
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA96
Recommandations 1/2
•
•
•
•
•
Pas de variables d'instance publiques
Pas d'accesseurs inutiles
Identifier les variables immuables (pas de synchro)
Peu de variables/méthodes statiques (classe)
Long plutôt que int et double / float
– moins d'erreur de dépassement
• Protected mieux que Private
• Minimiser les accès aux variables d'instance dans les méthodes
– utiliser des accesseurs protected
•
•
•
•
•
•
•
Pas de surcharge sans nouveau paramètre (sinon utiliser instanceof())
Méthodes simples
Préferer void : x.methode1().methode2()
méthodes publiques = synchronized
Si surcharge de Object.equals() alors surcharge de Object.hashcode( )
Pas de clonage intempestif
Utiliser notifyAll plutot que notify ou resume
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA97
Recommandations 2/2
• Si possible créer un constructeur sans paramètre
– Class.newInstance()
• Pas de final sinon pour de l'optimisation de performances
• Interfaces mieux que classes abstraites (héritage simple)
• Préférer abstract void maMethodeVide(); à void maMethodeVide(){ }
• Import java.awt.Button mieux que java.awt.*
• Nommer les thread pour le débogage en distant
• Utiliser plutôt implements Runnable que extends Thread
• Ne pas abuser du Garbage Collector (-verbosegc et -prof)
• BufferedInputStream : optimisation des performances
• Surcharger toString des classes définies (debogage)
Ne pas croire tout ce qu'on dit !
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA98
Ressources Java : Livres
• JavaSeries O'Reilly
– Couvre tous les aspects : tutorial, thread, jdbc, Beans
– Ecris par les concepteurs du langage : Exploring Java (valise), Niemeyer,
Peck
• Bibles de référence
– The Java Language Specification : James Gosling, Bill Joy, Guy Steele AddisonWesley
– Core java (2.0) v1
• Java client-server
– Cédric Nicolas, Christophe Avare, Frédéric Najman, Eyrolle
• Sun (http://www.sun.com/)
– Spécifications : Java, VM, JavaBeans...
• Conception Objets
– Design Patterns Erich Gamma ITP
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA99
Ressources Java : Web
• http://www.sun.com
– jdk, documents, pointeurs, projets
• http://www.gamelan.com
– Applet, Scripts, JavaScripts
• http://www.stars.com
– Codes, Exemples, Tutoriels (pas que Java)
• JavaDevelopperConnexion
– http://java.sun.com/jdc
– http://java.sun.com/jdc/techDocs/newsletter/index.html
• http://www.blackdown.org
Stéphane Frénot - [email protected] - Dpt Télécommunications
IJA100
Téléchargement