Introduction

chuckleelephantbutteSoftware and s/w Development

Jun 9, 2012 (5 years and 7 months ago)

484 views

Java1Lionel Seinturier
Java
Lionel Seinturier
Université des Sciences et Technologies de Lille
Lionel.Seinturier@lifl.fr
6/03/05
Java2Lionel Seinturier
Introduction
Objectifs de Java
•un langage simple, OO, portable
•philosophie WORA ("Write Once, Run Anywhere")
1 source s'exécute à l'identique sur +sieurs CPU/OS
(Solaris, Linux, Win xx, MacOS) pourvu d'une machine virtuelle (VM)
Principe
source
.java
bytecode
.class
compil.
exécution
VM
∀plate-forme, àpartir d'un .java
-.class obtenu par compilation identique
-.class s'exécute à l'identique
Contrepartie
.class -performant code natif (.exe)
mais ...
Java3Lionel Seinturier
Introduction
Historique
1991J. Gosling, B. Joy, A. Van Hoff : OAK (électronique grand public)
1993JDK 1.0, lien avec Web (applet)
1996Java Beans
1997JDK 1.1, Enterprise Java Beans, JavaCard, Java OS
1998Java 2 (JDK 1.2, 1.3, 1.4)
2004Java 5 (JDK 1.5) : annotations, types génériques, enum, auto-boxing
En cours de développement
2006Java 6 (beta 2) : amélioration API, intégration SGBD
2007 ?Java 7 : VM multi-langage Java, JavaScript, PHP, Python, …
Nombreuses technologies pour les applications client/serveur
JSP, servlet, JDBC, JMS, JavaIDL, JavaMail, RMI, JCE, JAAS, JNDI, JTS, JTA,
JavaCard, JMX, JMI, ......
Java4Lionel Seinturier
Introduction
Disponibilité
3 éditions
Java SE (Standard Edition)"le" JDK (compilateur + VM + librairies)
Java EE (Enterprise Ed.)serveur pour des applications d'entreprise
client/serveur (nécessite Java SE)
Java ME (Micro Ed.)VM + librairies pour des systèmes embarqués
(PDA, tel., ...)
Outils
-IDEEclipse, JBuilder, VisualAge, JDeveloper, Forte, NetBeans, ...
-VMJikes RVM, Kaffe, kissme, LaTTe, SableVM, ...
-compilateurJikes, GCJ, KJC, Espresso, Manta, …
-manipulation bytecodeASM, BCEL, BAT, CFParse, Jasmin, Javassist, …
-... nombreux autres
Java5Lionel Seinturier
Plan
1. Origines
2. Principes
3. Premiers exemples
4. Eléments syntaxiques de base
5. Classes
6. Héritage
7. Classes abstraites
8. Relation de typage
9. Exceptions
Java6Lionel Seinturier
1. Origines
Origines de Java
Influence : Simula, Smalltalk, C++
Analogies
-modèle d'objets à la C++
-instructions à la C++
-typage à la C++
-syntaxe à la C++
Mais
-pas d'héritage multiple
-gestion des erreurs + rigoureuse
-règles de conversion simplifiées
-simple et rigoureux
Java7Lionel Seinturier
2. Principes
3 principes
•langage basé sur des classes et objets
•interactions entre objets par échanges de messages
•héritage
Java8Lionel Seinturier
2. Principes
Principe 1 : langage basé sur des classes et objets
Classe : données (variables) et traitements (méthodes) manipulant les données
Objet : instance de classe
Programmation procédurale vs programmation objet
Compte p1, p2;
initialiser(p1,15);
initialiser(p2,20);
crediter(p1,5);
debiter(p2,5);
Compte p1, p2;
p1 = new Compte(15);
p2 = new Compte(20);
p1.crediter(5);
p2.debiter(5);
données
procédures
objets
Java9Lionel Seinturier
2. Principes
Principe 2 : interactions par échanges de messages
= invocation de méthodes entre objets
Toutes les méthodes d'une classe sont-elles invocables de l'extérieur ?
interface de la classe (= ens. des méthodes invocables de l'extérieur)
Les interf. définissent seulement des déclarations (nom+param.) de méthodes
pas de code
clavier1
Clavier
uc1
UC
ecran1
Ecran
instance de
ref
Java10Lionel Seinturier
2. Principes
Principe 3 : héritage
Construction d'une classe par rapport à une autre
compléter/étendre/spécialiser une classe existante
-ajout de données et/ou de méthodes
-modification de méthodes
Véhicule aérien
Véhicule terrestre
Voiture
Véhicule
Véhicule aquatique
Bateau
Radeau
Voiture amphibie
Java11Lionel Seinturier
3. Premiers exemples
Un programme simple
class Point2D {
private int abs;
private int ord;
public Point2D(int x,int y) { abs=x; ord=y; }
public Point2D() { abs=0; ord=0; }
public void move(int dx,int dy) { abs+=dx; abs+=dy; }
public void where() { System.out.println("x="+x+"; y="+y);
}
public class Test {
public static void main( String[] args ) {
Point2D p1, p2;
p1 = new Point2D();
p2 = new Point2D(10,20);
p1.where();
p1.move(10,10);
p1.where();
}
}
Java12Lionel Seinturier
3. Premiers exemples
Un programme simple avec héritage
class Point2DColor extends Point2D {
private int color;
public Point2DColor(int x,int y,intc) { super(x,y); color=c; }
public Point2DColor() { super(0,0); color=0; }
public void paint(int c) { color=c; }
public void whichColor() { System.out.println("c="+c); }
}
Java13Lionel Seinturier
3. Premiers exemples
Conventions d'écriture
Règles "communautaire" d'écriture des programmes Java
→améliore la lisibilité des programmes
•noms de classe, d'interface
-commence par une majuscule puis minuscules
-majuscule pour chaque partie d'un nom composé (ex.
EventListener)
•noms de variables, méthodes
-commence par une minuscule
-puis majuscule pour chaque partie d'un nom composé (ex.
baseObject)
•1 classe par fichier
-nom de fichier identique nom classe
•noms de package en minuscules (ex.
javax.transaction)
Java14Lionel Seinturier
3. Premiers exemples
Outils du JDK
Compilateur javac
javac MaClasse.java
autant de fichiers
.class qu'il y a de classes définies dans MaClasse.java
VM
java MaClasse
exécution de la méthode
main de la classe MaClasse
Options javac
-drépertoire d'écriture des
.class (par défaut répertoire courant)
-classpathlib (
.jar) ou rép contenant des .class nécessaires à la compil.
ex Unix
-classpath /tmp/foo.jar:/home/classes:../classes
Win
-classpath \tmp\foo.jar;\home\classes;..\classes
alternativement var. d'environnement CLASSPATH du shell
Options java
-classpathidem javac
Java15Lionel Seinturier
4. Eléments syntaxiques
Méthode
Bloc d'instructions nommé
-[prenant des paramètres en entrée]
-[retournant un paramètre en sortie]
défini uniquement à l'intérieur d'une classe
Syntaxe
[visibilité] typeRetour nom '(' [listeParamètres] ')' [exceptions] '{' instructions '}'
public boolean estPair( int nb ) { ... }
private double plus( double v1, double v2 ) { ... }
void méthodeSansRetour() { ... }
Instruction return fournit la valeur à retourner
Pas de return si type retour
void
Java16Lionel Seinturier
4. Eléments syntaxiques
Méthode
Visibilité des méthodes
-
public
partout
-
private
uniquement de la classe courante
-
protected
classe courante + ses sous-classes (héritage)
-
rien
classe courante + classes package courant (package public)
-
static
méthode de classe (pas d'accès aux variables d'instance)
1 seule valeur possible parmi les 4 1ères
Cas spécial de la méthode main (point d'entrée du programme)
-toujours la même signature
-récupère les arguments de la ligne de commande
-peut éventuellement lever des exceptions public static void main( String[] args ) { ... }
Java17Lionel Seinturier
4. Eléments syntaxiques
Attribut (field)
Espace mémoire typé pour le stockage de l'information
défini uniquement à l'intérieur d'une classe
Syntaxe
[visibilité] type nom [ '=' valeurInitiale ] ';'
int i = 1;
public double salaire;
final static protected double tva = 18.6;
[visibilité] type ( nom [ '=' valeurInitiale ] )* ';'
int i,j=10,k;
Java18Lionel Seinturier
4. Eléments syntaxiques
Attribut (field)
Visibilité des attributs
-
public, private, protected, rien
idem méthode
-
static
attribut propre à une classe →partagépar tous les objets de la classe
-
final
constante →initialisation obligatoire
Java19Lionel Seinturier
4. Eléments syntaxiques
Tests
if (condition) { instructions; }
else { instructions; }
•else facultatif
•{} facultatives s'il n'y a qu'une seule instruction
•else se rapporte toujours au dernier if if (cond1) { instructions; }
if (cond2) { instructions; }
else { /*cond2 faux*/ instructions; }
ok mais à éviter (risque d'erreur trop important)
Java20Lionel Seinturier
4. Eléments syntaxiques
Boucles
while (condition) { instructions; }
do { instructions; } while (condition);
•while : instructions peuvent ne pas être exécutées
•do/while : instructions exécutées au moins 1 fois
for ( initialisation ; condition ; incrément )
{ instructions; }

initialisation
while (condition) {
instructions;
incrément;
}
•l'initialisation peut contenir des déclarations de variables
for ( i=0 ; i<10 ; i++ ) { System.out.println(i); }
for ( int i=13, float j=15.7 ; ... ; ... ) { ... }
Java21Lionel Seinturier
4. Eléments syntaxiques
Branchements
switch( expression scalaire ) {
case valeur 1 : instructions; break;
case valeur 2 : instructions; break;
...
default : instructions;
}
•expression scalaire = entier ou caractère
•ne marche pas avec les chaînes
•break omis : les instructions du case suivant sont aussi exécutées
Java22Lionel Seinturier
4. Eléments syntaxiques
Types de base
Ensemble des valeurs légales pour une variable
•entiers: byte, short, int, long
•réels: float, double
•booléens: boolean
•caractères: char
Pas un type de base, mais très utiliséchaîne : String
Conversion sur les types de base numériques (cast)
var = (type cible) expr
int y = (int) (3.14*r*r);
Java23Lionel Seinturier
4. Eléments syntaxiques
Types de base : entiers
Représentation signée (complément à 2)
•byte: 1 octet[-128,+127]
•short: 2 octets[-32768,+32767]
•int: 4 octets[-2
31, 231-1]
•long: 8 octets[-2
63, 263-1]
Règles de conversion
•opérations avec des types hétérogènes
résultat : le "+ grand" des types mis en jeu
int x=3; long y=2;x*y
de type long
•conversion automatiquelorsque le type cible d'une affectation
est "+ grand" que le type de la valeur
int t=4; long u=t;
•sinon conversion explicite
int m=12; int i = (int)m;
Java24Lionel Seinturier
4. Eléments syntaxiques
Types de base : entiers
Règles de conversion (suite)
•la VM traite les byte et les short comme des int
reconversion paradoxale si nécessaire
short a=1,b=2; short c = (short)(a*b)
Bases de numérotation
•nb hexadécimal préfixé par 0xex : 0x1F
•nb octal (base 8) préfixé par 0ex : 011
11 en base 8 = 9 en base 10
Java25Lionel Seinturier
4. Eléments syntaxiques
Types de base : réels
Représentation IEEE 754-1985
•float: 4 octets
•double: 8 octets
•notation scientifique17.5e-3 -8.0 0.57e3
•mêmes types de règles de conversion que pour les entiers
•les valeurs sont par défaut des double
pour les float utilisation du suffixe f
float pi = 3.14f;
Types de base : booléens et caractères
•boolean: 2 valeurs true et false
•char: caractères entre apostrophes 'e'
utilisation anti-slash '\'' '\\'
Java26Lionel Seinturier
4. Eléments syntaxiques
Opérations sur les types de base
Comparaison
== != < > <= >=
Arithmétiques
+ -* / % ++ ---
Manipulation de bits
& | ^ ~ << >> >>>
^
XOR
~
NOT
>>
décalage à droite en conservant le signe
>>>
décalage à droite en ajoutant des 0
Affectations
= += -= *= /= <<= >>= >>>= &= ~= !=
ternaire ?:
Logiques
&& || !
Java27Lionel Seinturier
4. Eléments syntaxiques
Chaînes de caractères
•type (classe) String
•entre guillemets "informatique"
•utilisation anti-slash "a\"\\b"
•concaténation de chaînes avec l'opérateur + ou +=
String res = "hello" + " ";
res += "world";
•test d'égalité de chaînes avec la méthode equals (pas avec ==)
String s = "hello";
s.equals("hello") →true
s.equals("Hello") →false
Java28Lionel Seinturier
4. Eléments syntaxiques
Tableaux
DéclarationtypeElement[] nom
ex
int[] tabEntiers;
Initialisation avec {} ou allocation avec new
tabEntiers = new int[5];
tabEntiers = { 12, 7, -8 };
•accès aux éléments avec
[]tabEntiers[3]
•indices de 0 à taille-1
•pas de contrôle de dépassement d'indice à la compilation
erreur à l'exécution si dépassement
•∀tableau, attribut length contient sa taille
for ( int i=0 ; i < tabEntiers.length; i++ ) {
System.out.println(tabEntiers[i]);
}
Java29Lionel Seinturier
4. Eléments syntaxiques
Tableaux
•déclaration seule ne suffit pasdéclaration et allocation obligatoires
•mais
int[5] tab interdit
int[] tab = new int[5]
Tableaux multi-dimensionnels float[][] matrice;
initialisation
matrice = {{1,2},{},{4}};
ou allocation
matrice = new int[5][4],
ou allocation
matrice = new int[2][];
matrice[0] = new int[7];
matrice[1] = new int[2];
Java30Lionel Seinturier
4. Eléments syntaxiques
Références d'objets
•+sieurs références peuvent "pointer" sur le même objet
•affectation possible entre références
•tests
==
et !=
possibles sur les références
•référence nulle
null
ref1 = new MaClasse();
ref2 = ref1;
ref3 = new MaClasse();
ref4 = null;
ref1 == ref2→true
ref1 != ref3→true
ref1
ref2
ref3
ref4
Java31Lionel Seinturier
4. Eléments syntaxiques
Passage de paramètres
Passage par valeur
≡la méthode travaille sur une copie de la valeur
void inc(int x) { x++; System.out.println(x); }
.. main(..) {int y=4; System.out.println(y);
inc(y); System.out.println(y); }
Affichage : 4 5 4
Les références sont aussi passées par valeur
≡les objets sont passés par référence
class Foo { int x; Foo(int x){this.x=x;} }
void inc(Foo f) { f.x++; System.out.println(f.x); }
.. main(..) { Foo f=new Foo(4); System.out.println(f.x);
inc(f); System.out.println(f.x); }
Affichage : 4 5 5
Java32Lionel Seinturier
4. Eléments syntaxiques
Surcharge
Plusieurs méthodes dans la même classe avec
-1 nom identique
-des paramètres ≠
ex
void afficher( int i );
void afficher( float f );
void afficher( int i, float f );
Pas de surcharge sur le type de retour
ex
void afficher( int i );
boolean afficher( int i );
interdit (considéré comme une tentative de redéfinition de la même méthode)
Java33Lionel Seinturier
4. Eléments syntaxiques
Surcharge
Algorithme de résolution de surcharge
But : trouver la méthode à appeller en cas de surcharge
class Foo {
void fun( int a, double b ) {..}// fun0
void fun( double a, long b ) {..}// fun1
void fun( int a, float b ) {..} }// fun2
fun(12,(float)3.14) →appel de fun0 ? ou de fun2 ?
Recherche du profil le + proche selon ⊆des types
int ⊆int et float ⊆double (int,float) ⊆(int,double) appel de fun2
Il peut ne pas y avoir de solution
fun(12,3) ? fun0 ? fun1 ? fun2 ? (les 3 "conviendraient")
fun2 ⊆fun0 mais fun2 et fun1 ne sont pas comparables par ⊆
pas possible de def. le profil le + proche erreur de compilation
Java34Lionel Seinturier
4. Eléments syntaxiques
Instructions de saut
Instructions de saut utilisables à l'intérieur d'un bloc
-break: sortie de bloc
-continue: saut à la fin du bloc (on reste dans le bloc)
while ( i < 10 ) {
...
if ( i == 6 ) continue;
...// instructions sautées si i==6
}
Remarques
-break: sortie de bloc
-return: sortie de méthode
-System.exit(0): sortie de programme
Instructions de saut avec des étiquettes (à la goto) proscrire
Java35Lionel Seinturier
4. Eléments syntaxiques
Packages
Permettent de regrouper des classes ayant un lien logique entre elles
ex :java.ioclasses pour les entrées/sortie
java.netclasses pour la gestion du réseau
•organisation hiérarchique (ex : jussieu.master.srcs.tp1)
•un package peut contenir des classes et/ou d'autres packages
•les noms de package java et javax sont réservés pour le JDK
•un prog. utilisant les classes d'un autre package doit les importer (mot clé import)
ex :import java.io.IOException;
import java.net.*;// toutes les classes du package
•mot clé package pour définir le package courant
•ordre des mots-clés obligatoire dans un programme : package, import, class
•les classes du package java.lang sont importées automatiquement
•les classes du package courant sont importées automatiquement
Java36Lionel Seinturier
5. Classes
Classes
Unité fondamentale de structuration des applications en Java
1ère étape de modélisation OO : trouver les classes
Syntaxe simplifiée
[public] class nom '{' instructions '}'
public class MaClasse { ... }
class MaClasse2 { ... }
•public: classe visible de partout
•rien: classe visible du package courant (package protected)
Dans 1 fichier
•1 classe public et 1 seule (nom fichier = nom classe publique)
•0 ou n classes package protected
Java37Lionel Seinturier
5. Classes
Constructeurs de classe
Méthode d'initialisation exécutée juste après l'instanciation dela classe (new)
Permet
•d'initialiser des données
•d'exécuter des traitements initiaux
•d'allouer des ressources pour l'instance (ouverture de fichiers, ...)
Syntaxe
[public|protected|rien] nom '(' [paramètres] ')' '{' ... '}'
public class MaClasse {
public MaClasse(int init) { ... } }
•nom du constructeur = nom de la classe
•pas de type de retour (implicitement retourne une réf. celle de l'obj. construit)
•possibilité de surcharge
Java38Lionel Seinturier
5. Classes
Constructeurs de classe
class Point2DColor {
private int color;
private int abs, ord;
public Point2DColor(int x,int y,int c){ ... }
public Point2DColor(int c){ ... }
public Point2DColor(){ ... }
...
}
public class Test {
public static void main( String[] args ) {
Point2DColor p1 = new Point2DColor();
Point2DColor p2 = new Point2DColor(4);
Point2DColor p3 = new Point2DColor(10,0,2);
Point2DColor p4 = new Point2DColor(10,0);// erreur
}
}
Java39Lionel Seinturier
5. Classes
Constructeurs de classe
Mot clé this dans les constructeurs
appel d'un autre constructeur de la même classe
si utilisé, uniquement en 1ère instruction du constructeur
en général un constructeur avec toutes les initialisations
+ les autres constructeurs font référence à ce 1er avec des valeurs par défaut
class Point2DColor {
private int color;
private int abs, ord;
public Point2DColor(int x,int y,int c){ abs=x; ord=y; color=c; }
public Point2DColor(int c) { this(0,0,c); }
public Point2DColor() { this(0,0,0); }
...
}
Java40Lionel Seinturier
5. Classes
Attributs et méthodes de classe (static)
Attribut de classe
-information partagée par tous les objets de la classe (constantes, ...)
-compteurs globaux (ex : # d'objets de la classe, ...)
Méthode de classe
-méthode non liée à un objet spécifique (ex : fonction mathématique, ...)
class Point2DColor {
private static int nbPoint2DColor;
private int color;
private int abs, ord;
public Point2DColor(int x,int y,int c) {
abs=x; ord=y; color=c;
nbPoint2DColor++;
}
... }
Java41Lionel Seinturier
5. Classes
Attributs et méthodes de classe (static)
Attention o1 = new MaClasse();
o2 = new MaClasse();
// toutes var. init. à 0
o1.cpt++; // = 1
o2.cpt++; // = 1
o1.s++; // = 1
o2.s++; // = 2
•chaque cpt est propre à son instance
•s est partagé par toutes les instances de MaClasse
o1
cpt
s
cpt
s
o2
MaClasse
static int s
int cpt
Java42Lionel Seinturier
5. Classes
Auto-référence
Mot clé this : désigne la référence de l'objet courant
Permet de
-désigner les attributs de l'instance en cas d'ambiguïté de nom
(avec variable locale ou paramètre)
-construire des structures de données chaînées
-implanter des mécanismes de rappel d'objet (callback)
-enchaîner des appels de méthodes
Désignation des attributs en cas d'ambiguïté
class Carre {
int color;
public void setColor(int color) { this.color = color ; }
}
Java43Lionel Seinturier
5. Classes
Auto-référence
Implantation d'un mécanisme de rappel (callback)
class MaClasse {
void foo() {
Gestionnaire g =
new Gestionnaire();
g.bar(this);
}
void fb() { ... }
}
class Gestionnaire {
void bar(MaClasse mc)
{ mc.fb(); }
}
Gestionnaire
bar
MaClasse
foo
fb
fb
Java44Lionel Seinturier
5. Classes
Auto-référence
Echaînement d'appels de méthodes
class Fraction {
int num=0, den=1;
public Fraction doubler() { num*=2; return this; }
}
Fraction f1 = new Fraction();
f1.doubler().doubler();
1
2
Rq : il est toujours possible de ne pas récupérer la valeur retournée
par une méthode (ici c'est le cas de 2)
Java45Lionel Seinturier
5. Classes
Interfaces
Classe "dégradée" ne contenant que des définitions
-de constantes(automatiquement
public final static)
-et/ou de profils de méthodes(automatiquement
public)
Pas de code
Mot clé interface
interface LampeInterf {
final int off = 0;
final int on = 1;
void allumer();
boolean estAllume();
}
Java46Lionel Seinturier
5. Classes
Interfaces
Implémentation des interfaces
Chaque classe qui implémente une interface
-récupère toutes les constantes
-doit fournir du code pour toutes les méthodes de l'interface
sinon erreur de compilation
-peut ajouter n'importe quel élément (attribut, méthode) constitutif d'une classe
class Lampe implements LampeInterf {
private int etat;
// implantation des méthodes de l'interface LampeInterf
public void allumer() { etat = on; }
public boolean estAllume() { return (etat==on); } }
-une classe peut implémenter +sieurs interfaces(implements Itf1,Itf2)
Java47Lionel Seinturier
5. Classes
Classe -fonctionnalités diverses Méthode toString
obtention d'une représentation "chaîne de caractères" (stringified) d'un objet
but : pouvoir afficher des infos pertinentes concernant un objet
automatiquement invoquée lorsqu'on concatène (opérateur +)
un objet à une chaîne de caractères
class Fraction {
...
public String toString() { return num+"/"+den; }
}
Fraction f = new Fraction(8,3);
System.out.println( "La fraction vaut : " + f );
Appel à f.toString()
Java48Lionel Seinturier
5. Classes
Classes incluses (inner classes)
Classe définie à l'intérieur d'une autre
classe liée à une classe conteneur (dite outer)
qui l'utilise pour ses besoins internes
la déf. de la classe inner comme classe autonome ne se justifie pas
class Outter {
...
public class Inner { ... }
public void foo() { ... new Inner()... } }
•les classes inner peuvent avoir une visibilité (public, private, static, ...)
•une classe inner peut s'instancier à l'extérieur de la classe outter
si la visibilité le permet
Outter outter = new Outter();
Outter.Inner inner = new Outter.Inner();
Java49Lionel Seinturier
5. Classes
Classes anonymes
Définition de classes incluses sans nom (anonyme)
•la classe est définie en même temps qu'elle est instanciée (new)
•la classe anonyme étend une classe de base (celle du new)
•la classe anonyme ne peut être utilisée qu'une fois
classe anonyme
classe étendue
méthode de la classe Thread
redéfinie dans la classe anonyme
public void foo() {
Thread t =
new Thread()
{
public void run() { ... }
};
}
Java50Lionel Seinturier
5. Classes
Blocs de code static
Blocs de code exécutés 1 fois et 1 seule lors du chargement de sa classe
class Foo {
...
static { ... }
...
}
•utilisation : initialisation des attributs static de la classe
•+sieurs blocs static possibles
•les blocs static sont exécutés dans l'ordre de leur définition
Java51Lionel Seinturier
6. Héritage
Héritage
Définir de nouvelles classes à partir de classes existantes
Spécialisation/enrichissement
d'une classe par ajout et/ou
redéfinition
Mot clé extends
pour désigner la super-classe
Mot clé super pour désigner les méthodes/constructeurs de la super-classe
Redéfinition de constructeurs
-
super nécessairement 1ère instruction (sauf si on utilise this)
-appel au super-constructeur non obligatoire
super-classe (classe parente)
sous-classe
(classe fille)
héritage
Java52Lionel Seinturier
6. Héritage
Héritage
class Point2DColor extends Point2D{
private int color;
public Point2DColor(int x,int y,int c) { super(x,y); color=c; }
public Point2DColor() { super(0,0); color=0; }
public void paint(int c) { color=c; super.paint();}
public void whichColor() {
System.out.println("c="+c);
}}
Redéfinition de méthodes
-nécessairement même type de retour (sinon erreur de compilation)
-interdiction de restreindre le droit d'accès (on peut l' )
-contraintes sur les exceptions (voir + loin)
-attribut
final : une méthode déclarée final ne peut pas être redéfinie
(attribut final utilisable également pour les classes)
Java53Lionel Seinturier
6. Héritage
Héritage
Redéfinition d'attribut
-type modifiable
-accès àl'attribut de la super-classe avec
super
Classe java.lang.Object
-super-classe de toutes les classes Java
-lien d'héritage défini automatiquement par le compilateur
-définit des méthodes appelables sur tout objet Java
-getClass, toString, hashCode, equals
-notify, notifyAll, wait (gestion Thread & synchronisation)
Java54Lionel Seinturier
7. Classes abstraites
Classes abstraites
Classe dont 1 ou +sieurs méthodes n'ont pas de code
permet d'abstraire des comportements dans une hiérarchie d'héritage
n'a d'utilitéque si les méthodes abstraites sont "concrétisées"
dans une sous-classe
Mot clé
abstract devant chaque méthode abstraite, devant la classe
abstract class CapteurTemperature {
double temp;
double getTemp() { return temp; }
abstract void calibrer();
// pas de code pour calibrer
// devra être défini ultérieurement dans une sous-classe
}
Java55Lionel Seinturier
7. Classes abstraites
Classes abstraites
•1 classe abstraite ne peut pas être instanciée
•1 classe abstraite peut hériter d'une classe abstraite ou non
•1 classe peut être définie abstraite alors qu'aucune méthode ne l'est
interdire son utilisation telle quelle
obliger le développeur àla sous-classer
ex : java.lang.ClassLoader
•si toutes les méthodes abstraites et pas de constantes ≡interface
interface
classe
objet
est implan
tée par 0,n
est instan
ciée en 0,n
interface
classe
objet
implante
0,n
est inst
ance d’ 1
Java56Lionel Seinturier
8. Relation de typage
Relation de typage
Définition d'une relation de (sous)-typage par
-implémentation d'interface(s)
-héritage de classe
Mot cléinstanceof permet de tester ∈d'un objet
àune hiérarchie d'héritage et/ou d'implantation
class C1 implements I1,I2 { ... }
class C3 extends C1 implements I3 { ... }
C1 c1 = new C1();
C3 c3 = new C3();
(c1 instanceof I1) == true(idem I2,C1)
(c3 instanceof I3) == true(idem I2,I1,C1 par héritage)
(idem C3)
Java57Lionel Seinturier
8. Relation de typage
Relation de typage
Affectation d'une instance à une référence
dont le type est un sous-type de l'instance C3 c3 = new C3();
C2 refC2 = c3;
I2bis refI2 = c3;
C5 refC5 = c3;// interdit C5 n'est pas un sous-type de C3
C4 refC4 = c3;// interdit C4 n'est pas un sous-type de C3
I5 refI5 = c3;// interdit I5 n'est pas un sous-type de C3
C1
C2
C3
C4
C5
I2
I2bis
I3
I3bis
I5
Java58Lionel Seinturier
8. Relation de typage
Relation de typage
Une référence peut être convertie vers un sur-type
compatible avec l'instance référencée I2 refI2 = new C3();
I3 refI3 = (I3) refI2;
C3 refC3 = (C3) refI2;
C5 refC5 = (C5)refI2;// interdit C5 n'est pas un sous-type de C3
C4 refC4 = (C4)refI2; // interdit C4 n'est pas un sous-type de C3
I5 refI5 = (I5)refI2; // interdit I5 n'est pas un sous-type de C3
C1
C2
C3
C4
C5
I2
I2bis
I3
I3bis
I5
Java59Lionel Seinturier
9. Exceptions
Exceptions
Mécanisme permettant de signaler la fin de l'exécution d'une méthode
de façon "anormale"
ex : division par 0, dépassement d'indice dans un tableau, fichier non trouvé, ...
•les exceptions sont des classes Java qui héritent de java.lang.Exception
•vocabulaire : une exception est levée, puis récupérée, éventuellement propagée
2 types d'exception
-runtime: levées par la JVM, sous-classe de RuntimeException
communes à tous les prog. Java
-utilisateur :propre à un programme
Java60Lionel Seinturier
9. Exceptions
Exceptions
Syntaxe
déclaration
class MonException extends Exception { ... }
levée
void foo() throws MonException {
... throw new MonException(); ...
}
récupération
try {
... // appel d'une méthode levant MonException
} catch( MonException me ) {
... // code lorsque MonException est levée
}
Java61Lionel Seinturier
9. Exceptions
Exceptions
Exemple
public class Math {
public static double div( double a, double b ) throws DivParZero {
if (b==0.0) throw new DivParZero("Division par zéro");
return a/b;
}
public static void main(String[] args) {
try { double res = div(12.0,0.0); }
catch( DivParZero dpz ){ dpz.getMessage(); }
}
}
class DivParZero extends Exception {
public DivParZero( String mess ) { super(mess); } }
-la division par 0 sur des
int
lève java.lang.ArithmeticException
-la division par 0 sur des
float
ou double renvoie une valeur spéciale "Infinity"