0% ont trouvé ce document utile (0 vote)
125 vues74 pages

2 Java

Ce document présente les concepts de base de la programmation orientée objet en Java tels que les classes, objets, héritage, abstraction et encapsulation.

Transféré par

aladin007
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
125 vues74 pages

2 Java

Ce document présente les concepts de base de la programmation orientée objet en Java tels que les classes, objets, héritage, abstraction et encapsulation.

Transféré par

aladin007
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 74

Programmation oriente objets

et JAVA avanc

Unit 2: Concept Objet: Classe, Objet,


Hritage, classes abstraites et
interfaces

Redouane EZZAHIR
[email protected]
Plan de cours
Introduction JAVA
Concept Objet:
Classe, Objet, Hritage, abstraction, interfaces
Exceptions et Entres/sorties
Gnriques (types paramtrs)
Programmation concurrente (threads, synchronisation)
JDBC et API Java pour XML
Java Servlet & JSP
JSF (JavaServer Faces)
Hebirnate et JPA
Le Framework Maven
Plan pour aujourd'hui
Classes et objets
Accs aux membre et le mot cl this
Principe de la P.O.O :
1 objet 1e responsabilit
Encapsulation
Immutabilit (final)
Type et Classe
Dcouplage interface/implantation
Abstraction et concept dhritage
Principe de localit et polymorphisme
Programmation objet

Le but principal de la programmation


objet est d'aider la conception et la
maintenance de logiciels:
Modularit
Extensibilit
Polymorphisme
Rutilisabilit
Classes et objets
Pour un dveloppeur java tout est objet. Les objets classs
(en classes dobjets) par leurs caractres et fonctionnalits
communes.

Classe: Vehicule FormeGeometrique Animal


Classe java
Une classe java est une structure qui regroupe des
champs et des mthodes et qui forme une sorte de
moule partir duquel on cre des objets de
l'application que l'on est en train de dvelopper.

La cration d'un objet se fait par instanciation


(dmoulage) d'une classe.
champs class Point {
int x;
int y;
mthodes
void translate(int dx,int dy) {
x+=dx;
y+=dy;
}
}
Un objet
Un objet java est une variables, construit sur le
modle d'une classe instance d'une classe .
Il reprsente :
un objet physique (table, chaise, etc)
un concept (comparateur, manager, Iterateur, etc)
Il possde :
des donnes propres quil ne montre personne
des fonctionnalits accessibles tous
Il communique avec les avec les autres objets
Fonctionnalit Donnes de l'objet
question
rponse
Accs aux membres

L'accs aux mthodes d'une classe se


fait par la notation . sur une rfrence
un objet.
class Point { class AutreClass {
double rho;
double theta; void autreMethod(Point p) {
p.init(2.0,3.0);
void init(double x,double y) { System.out.println(p.theta);
rho=Math.hypot(x,y);
theta=Math.atan2(x,y);
} }
} }
this
Le mot-cl this dsigne en permanence l'objet dans
lequel on se trouve c,,d quil correspond la
rfrence de l'objet sur lequel la mthode courante a
t appele
class Main { class Matrix {
public void toto() { boolean equals(Matrix m) {
Matrix m1=... if (this==m)
Matrix m2=... return true;
if (m1.equals(m2)) { ...
... }
} }
}
}

Ici, this aura la valeur de m1 et


m la valeur de m2
Principes de la lutte
Principaux principes de la programmation
objets :
1 objet 1e responsabilit
Encapsulation
Immutabilit (final)
Type et Classe
Dcouplage interface/implantation
Abstraction et concept dhritage
Principe de localit et polymorphisme
1 objet/1 responsabilit

Si l'on veut rutiliser des objets il ne faut


pas qu'il apporte trop de fonctionnalit

2 objets => 2 responsabilit, etc

Utiliser la dlgation entre objet (le fait


qu'un objet en connaisse un autre) pour
sparer les responsabilits
Exemple

On veut une application qui gre les


places de parking et calcule tout
instant combien le parking va rapporter
si toutes les voitures sortent maintenant
Le prix payer dpend uniquement du
type de voiture
Exemple (suite)

Ici, 4 responsabilit, 4 objets:


Parking: stocker des voitures
Voiture: la voiture en elle-mme
Modele: le modle de voiture
PrixModele: indique le prix en fonction d'un
modle
Exemple (fin)

Diagramme de classe correspondant

Parking PrixModele
+entrer(int,Voiture v) +getPrix(Modele):int
+sortir(int):voiture

Voiture 1 Modele
-matricule:String -nom:String
+getNom():String
+setNom(String)
Encapsulation

L'encapsulation est un principe qui garantie


qu'aucun champ d'un objet ne pourra tre
modifier pour corrompre l'tat d'un objet sans
une vrification pralable

L'tat de lobjet ne pourra tre modifi (s'il est


modifiable) que par des mthodes vrifiant les
donnes rentres
Encapsulation

Exemple d'un point en coordonne polaire


class Point { class AutreClass {
double rho; void autreMethod(Point p) {
double theta; p.init(2.0,3.0);
System.out.println(p.theta);
void init(double x,double y) {
rho=Math.hypot(x,y); p.rho=-1; // aie aie !!
theta=Math.atan2(x,y); }
} }
}

La classe Point ne garantie pas l'encapsulation !

Solution : utiliser les modificateurs de visibilit


Visibilit et encapsulation

Un champs est toujours priv !!


class Point {

private double rho;


private double theta;

public void init(double x,double y) {


rho=Math.hypot(x,y);
theta=Math.atan2(x,y);
}
}
class AutreClass {
void autreMethod(Point p) {
p.init(2.0,3.0);
System.out.println(p.theta); // ne compile pas
p.rho=-1; // ne compile pas
}
}
Visibilit et encapsulation (2)

toString pour laffichage!


class Point {

private double rho;


private double theta;

public void init(double x,double y) {


rho=Math.hypot(x,y);
theta=Math.atan2(x,y);
}
public String toString() {
return rho+","+theta;
}
}

class AutreClass {
void autreMethod(Point p) {
p.init(2.0,3.0);
System.out.println(p.toString());
}
}
Mais il y a un problme
Supposons que l'on souhaite que rho ne soit
jamais gal zro class Point {
private double rho;
private double theta;

On peut obtenir la public void init(double x,double y){


rho =Math.hypot(x,y);
valeur des champs theta=Math.atan2(x,y);
}
avant l'initialisation public String toString() {
return rho+","+theta;
}
}
Solution: constructeurs
class AutreClass {
void autreMethod(Point p) {
System.out.println(p.toString()); // affiche 0,0 oups
p.init(2.0,3.0);
}
}
Constructeur
class Point {
private double rho;
private double theta;
Le constructeur est crit
public Point(double rho,double theta) {
pour garantir les if (rho<=0)
throw new IllegalArgumentException(
invariants "illegal rho "+rho);
this.rho=rho;
this.theta=theta;
}
On ne peut crer un public String toString() {
return rho+","+theta;
objet sans appeler de }
constructeur }

public class AnotherClass {


public static void main(String[] args) {
Point p=new Point(2,3);
Point p2=new Point();
} // cannot find symbol constructor Point()
}
Constructeur par dfaut

Si aucun constructeur n'est dfini, le


compilateur rajoute un constructeur
public sans paramtre

public class Point {


private double x;
private double y;

public static void main(String[] args) {


Point p=new Point(); // ok
}
}
Appel inter-constructeur
public class Counter {
Appel un autre public Counter(int initialValue) {
this.counter=initialValue;
constructeur se fait }
public Counter() {
avec la notation }
this(0);

public int increment() {


this(...) return counter++;
}
private int counter;
}

public class AnotherClass {


public static void main(String[] args) {
Counter c1=new Counter();
System.out.println(c1.increment());
this(...) doit tre la

Counter c2=new Counter(12);


System.out.println(c2.increment()); premire instruction
}
}
Champs final
Il est possible de dclarer un champs
constant (final)

public class Point {


private final int x;
private final int y;

public Point(int x,int y) {


this.x=x;
this.y=y;
}
public Point() {
} //variable x might not have been initialized

Le compilateur vrifie que la valeur est assigne


une seule fois et par chaque constructeur
Diffrents types de mthodes

Classification des mthodes d'un objet


Constructeur
Initialise l'objet
Accesseur
Getter (getX)
Export les donnes (souvent partiellement)
Setter (setX)
Import les donnes (en les vrifiant)
Mthode mtier (business method)
Effectue des calculs en fonction des donnes
Accesseurs
public class Point {
Les accesseurs sont private double x;
private double y;
des mthodes
public Point(double x,double y) {
permettant l'accs this.x=x;
this.y=y;
des attributs }
public double getX() {
return x;
}
public void setX(double x) {
System.out.printf this.x=x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y=y;
}
}
Point p=new Point(1,1);
System.out.printf("%f,%f\n",p.getX(),p.getY());
Intrt des accesseurs
public class Point {
private double rho;
Cela permet de private double theta;

changer public Point(double x,double y) {


init(x,y);
l'implantation sans }
private void init(double x,double y) {
changer le code rho=hypot(x,y);
theta=atan2(x,y);
d'appel. }
public double getX() {
return rho*cos(theta);
}
public void setX(double x) {
init(x,getY());
}
Point p=new Point(1,1); public double getY() {
System.out.printf("%f,%f\n" return rho*sin(theta);
,p.getX(),p.getY()); }
public void setY(double y) {
init(getX(),y);
}
}
Type et classe

Les variables (locales ou champs) ont un


Type
Les rfrences ont une classe
public static void main(String[] args) {

String s=args[0];
Type Whale whale=new Whale(2,3);
}

Classe
Les Types objet (2)

Il existe 4 faons de dfinir un type objet :


Dfinir une classe
Dfinir une interface
(type que l'on ne peut pas instancier)

Dfinir une numration


(ensemble fini de valeurs,
pas instanciable non plus)

Dfinir une annotation


(sorte interface spciale)
Rutilisation (Hritage)
Pour raccourcir les temps dcriture et de mise au
point du code dune application, il est intressant
de pouvoir rutiliser du code dj utilis :
Rutilisation par des classes clientes
Dans une classe, on cre des instances de dautre classes
et on leurs demande des services.

Rutilisation avec modifications du code source


Besoin du code source de la classe

Rutilisation par lhritage


Besoin du code compil de la classe mre
On peut ajouter de nouvelles champs et nouvelles
mthodes ou modifier certaines mthodes
Hritage
Point FormeGeometrique
centre:Point
Exemple x:double
y:doule couleur:int
nom:String deplacer(x:int,y:int):void
deplacer(x:int,y:int):void

Cercle
L'hritage, c'est 3 choses : rayon:double
Rcupration des membres (hritage structurelle)
(cercle possde les champs
de FormeGeometrique)

Possibilit de redfinir les mthodes


(changer le code de deplacer ))

Sous-typage ( FormGeometrique est un sous-type de Cercle)


L'hritage concrtement

En Java, l'hritage se fait en utilisant extends.

public class Cercle extends FromeGemetrique{


final double rayon;
public Cercle(Point centre, double r, int couleur){...}

public class FromeGemetrique{


private Point centre;
final int couleur;

public FromeGemetrique(Point centre, int couleur) {


this.centre = centre;
this.couleur = couleur ;
}
public void deplacer() {
this.centre.deplacer();
}
}
Hritage et Object
En Java, toutes classes hritent de
java.lang.Object, directement ou
indirectement.

Directement : si l'on dclare une classe sans


hritage, le compilateur rajoute extends
Object.

Indirectement : si l'on hrite d'une classe celle-


ci hrite de Object (directement ou
indirectement)
C'est quoi le sous-typage
Le sous-typage, c'est le fait de pouvoir considrer
une rfrence une sous-classe comme tant une
rfrence une super-classe
Pile Tas
Et, concrtement : cercle @Cercle
forme

public static main(String[] args) {


cercle cercle=new cercle(new Point(0,0), 1, 5);
System.out.println(cercle);
FormeGeometrique forme = cercle; // sous-typage
System.out.println(forme);
}

Cercle est un sous-type de FromeGeometrique


Sous-Typage
En Java, tous les types objets sont
sous-types de Object.
La relation de soustypage vient de :
L'hritage, si A hrite de B, alors A est un
sous-type de B
L'implmentation d'interface, si A implante B
alors A est un sous-type de B
Plus des relations sur les tableaux
Les wildcards sur les types paramtrs
Hritage des membres
Une classe hrite de tous les membres de la
super-classe
public class Cercle extends FormeGeometrique{
final double rayon;

public static main(String[] args) {


Cercle cercle=new Cercle(new Point(0,0), 1.7, 5);
System.out.println(cercle.centre +" " +
cercle.rayon +" " + cercle.couleur);
}
} Tas

@Point
Pile
centre 5
cercle couleur
rayon
1.7
Hritage de champs

Il est possible de nommer un champs de


faon identique dans une sous-classe
public class Cercle extends FigureGeometrique{
final double rayon;
Color couleur;

public Color getColor() {


return this.couleur;
}
}
public class FigureGeometrique{
Les deux champs int couleur;
Point centre;
cohabitent public int getColor() {
return this.couleur;
}
}
Masquage de champs
On dit que le champs couleur de Cercle masque
le champs couleur de FormeGeometrique
public class Cercle extends FormeGeometrique{
final double rayon;
Color couleur;

public String toString() {



System.out.printf("%d", super. couleur);
..
}
}
public class FormeGeometrique{
super. permet d'accder int couleur;
Point centre;
au champs de la public int getColor() {
return this.couleur;
super classe }
}
Champs et Sous-typage

On accde au champs en fonction du


type de la rfrence
public static main(String[] args) {
Cercle cercle =new Cercle();
System.out.println(cercle.couleur);

FormeGeometrique forme= cercle; // sous-typage


System.out.printf("%d", forme.couleur);
}
Tas
@Point
@Cercle
Pile centre @Color
couleaur
cercle rayon
forme couleur 0 1.5
Hritage et constructeur
La premire instruction d'un constructeur est un
appel au constructeur de la superclasse
public class Cercle extends FormeGeometrique{
final double rayon;

public Cercle() { // implicite


super(); // bang
}
} // cannot find symbol constructor FormeGeometrique()

Le constructeur implicite fait appel au


constructeur par dfaut de la superclasse
super(...) et appel implicite

super(...) doit tre la premire


instruction du constructeur

Si l'instruction super(...) n'existe pas, le


compilateur ajoute un appel au
constructeur par dfaut de la classe
mre (super())
Constructeur et Superclasse
Lappel super(...) permet dinitialiser les champs (private) hrits
Mais attention!
Les arguments de super sont compils dans un contexte statique

class Cercle extends FormeGeometrique{


private final static Point DEFAULT_CENTRE= new Point(0,0);
private final int DEFAULT_COLOR = 0;
public Cercle() {
super(DEFAULT_CENTRE, DEFAULT_COLOR); // erreur
}
}

class FormeGeometrique {
private Point centre;
private int couleur;
public FormeGeometrique(Point centre, int couleur) {
this.centre =centre;
this.couleur=couleur;
}
}
Constructeur vs Mthode

La grosse diffrence entre un constructeur et


une mthode, c'est que l'on n'hrite pas
des constructeurs

Le constructeur de la classe hrit a pour


mission de :
demander l'initialisation de la classe mre au
travers de son constructeur
d'initialiser ses propres champs
Hritage de mthode
En tant que membre, une sous-classe hrite des
mthodes de la superclasse
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
this.rayon = r;

}
public static main(String[] args) {
Point p = new Point(0,0);
Cercle c1 =new Cercle(p, 1, 5);
c1.deplacer(2, 2); // ok
Cercle c2 = Cercle(null, 1, 5);
c1.deplacer(2, 2); // ok but,
//Exception in thread "main" java.lang.NullPointerException
}
}

deplacer() ne vrifie pas le champs centre


Redfinition de mthode
Il est possible de redfinir le code de
deplacer() dans Cercle
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
this.rayon = r;

}
public void deplacer() {
if(centre==null){
System.err.println("impossible de deplacer cet cercle" );
}
else this.centre.deplacer();
}
Assurer la redfinition
L'annotation@Override indique au
compilateur de gnrer une erreur si
une mthode ne redfinit pas une autre
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
this.rayon = r;

}
public @Override void deplacer() {
if(centre==null){
System.err.println("impossible de deplacer cet cercle" );
}
else this.centre.deplacer();
}
Redfinition vs Surcharge

La surcharge correspond avoir des


mthodes de mme nom mais de profils
diffrents dans une mme classe

La redfinition correspond avoir deux


mthodes de mme nom et de mme
profils dans deux classes hrits
Redfinition ou Surcharge

Exemple de surcharge et de redfinition :


public class A {
public void m(int a) {...} // surcharge
public void m(double a) {...} // surcharge
}

public class B extends A {


public void m(long a) {...} // surcharge
public void m(double a) {...} // redfinition
}

m(double) de B redfinie m(double) de


A, le reste est de la surcharge
Mthodes et Sous-typage

On accde aux mthodes en fonction du type


rel de la rfrence Pile Tas

cercle @Cercle
forme
public static main(String[] args) {
Cercle cercle=new Cercle(...);
cercle.deplacer(1,1)); // Cercle::deplacer()
FormeGeometrique frome=cercle; // sous-typage
forme.deplacer(1,1); // toujours Cercle::deplacer()
}

Comme il y a redfinition, la mthode deplacer()


de FormeGeometrique n'est pas accessible
Redfinition et super.

La notation super. permet d'avoir accs aux


membres non static de la superclasse
public class Cercle extends FromeGemetrique{
final double rayon;
public Cercle(Point centre, double r, int couleur){
super(centre, couleur);
this.rayon = r;

}
public void deplacer() {
if(centre!=null){
super.centre.deplacer();
}

super.super.validate() ne marche pas.


Accs hors de la classe
Il n'est pas possible d'accder aux mthodes
redfinies hors de la sous-classe
Il n'est pas possible d'accder la mthode
deplacer() de FormeGeometrique

public static main(String[] args) {


Cercle cercle=new Cercle(...);
cercle.deplacer(1,1)); // Cercle::deplacer()
FormeGeometrique frome=cercle; // sous-typage
forme.super.deplacer(1,1); // cannot find symbol class
// FormeGeometrique
}

super. se marche que dans la sous-classe


Mthode final
Si une mthode est dclare final, celle-ci ne peut
tre redfinie
Important en terme de scurit
Peu, voire pas d'impact en terme de performance

public class PasswordValidator {


public final boolean checkPassword(char[] password) {
...
}
}
public class YesValidator extends PasswordValidator {
@Override public boolean checkPassword(char[] password) { // illgal
return true;
}
}
Classe final

Si une classe est dclare final, il est impossible


de crer des sous-classes
Mmes raisons que pour les mthodes

public final class PasswordValidator {


public boolean checkPassword(char[] password) {
...
}
}
public class YesValidator extends PasswordValidator { // illgal
...
}

Toutes les mthodes se comportent comme si


elles taient final
Hritage Multiple

Problmes de l'hritage multiple :


Si on hrite de deux mthodes ayant mme
signature dans deux super classes, quelle code
choisir ?
Performance en cas de sous-typage
Solution :
Il n'y a pas d'hritage multiple en Java
Java dfinit des interfaces et permet une
classe d'implanter plusieurs interfaces
Interface

Une interface dfinit un type sans code


On utilise le mot-cl interface

public interface List {


public Object get(int index);
public void set(int index,Object element);
}

Une interface dclare des mthodes sans


indiquer le code (implantation) de celles-ci
On dit alors que les mthodes sont abstraites
Instanciation d'interface
Il n'est pas possible d'instancier une
interface car celle-ci ne dfinie pas le code
de ses mthodes
public interface List {
public Object get(int index);
public void set(int index,Object element);
}

public class Main {


public static void main(String[] args) {
List list=
new List(); // illgal
}
}
Implantation d'interface
Implanter une interface consiste dclarer une
classe qui fournira le code pour l'ensemble des
mthodes abstraites
public interface List {
public Object get(int index);
public void set(int index,Object element);
}
public class FixedSizeList implements List {
public FixedSizeList(int capacity) {
array=new Object[capacity];
}
public Object get(int index) {
return array[index];
}
public void set(int index,Object element) {
array[index]=element;
}
private final Object[] array;
}
Implantation d'interface (2)
Le compilateur vrifie que toutes les mthodes de
l'interface sont implantes par la classe
public interface List {
public Object get(int index);
public void set(int index,Object element);
}
public class FixedSizeList implements List {
// FixedSizeList is not abstract and does not
override
// abstract method set(int,java.lang.Object)
public FixedSizeList(int capacity) {
array=new Object[capacity];
}
public Object get(int index) {
return array[index];
}
private final Object[] array;
}
Interface et Sous-typage
Le fait qu'une classe implante une interface implique
que la classe est un sous-type de l'interface
public class AtWork {
private void print(List list) {
for(int i=0;i<list.capacity();i++) {
System.out.println(list.get(i));
}
}
public static void main(String[] args) {
List l=new FizedSizeList(5);
...
print(l);
}
}

Permet d'crire une mthode gnrique

Appel une mthode d'une interface plus lent !



Hritage d'interface

Une interface peut hriter d'une ou plusieurs interfaces


Les mthodes de cette interface correspondent
l'union des mthodes des interfaces hrites

public interface Channel {


void close();
}
public interface ReadChannel extends Channel {
int read(byte[] buffer);
}
public interface WriteChannel extends Channel {
int write(byte[] buffer);
}
public interface RWChannel extends ReadChannel, WriteChannel
{
}
Interface, mthodes et champs
Les mthodes dclares dans une interface sont
obligatoirement :
abstraite (abstract)
publique (public)

Impossible de dfinir une mthode statique dans


une interface
Les champs dclars dans une interface sont
obligatoirement :
constant (final)
public (public)
statique (static)
Mthode publique

Impossible d'implanter une mthode d'une


interface avec une visibilit autre que public
public class FixedSizeList implements List {
public FixedSizeList(int capacity) {
array=new Object[capacity];
}
// get(int) in FixedSizeList cannot implement
// get(int) in List; attempting to assign
// weaker access privileges; was public
Object get(int index) {
return array[index];
}
...
private final Object[] array;
}
Interface et constantes
Eviter pour rcuprer des constantes
d'implanter une interface
public interface Orientation{
int NORD =0, SUD =1, EST= 2, OUEST=3 ;
public int getDirection();
}
public class Boussole implements Orientation{
Boussole() {
currentDirection = NORD ;
}
...

Ici, on dclarera plutt une numration


(cf plus loin)
@Override

En 1.5, @Override indique que l'on redfinie


une mthode, marche pas pour les mthodes d'interface

En 1.6, @Override pour dire qu'une mthode implante une


mthode dfinie par l'interface.
public class Boussole implements Orientation{
Boussole() {
currentDirection = NORD ;
}
@Override public int getDirection() {
return currentDirection ;
} // 1.6 ok
// 1.5: method does not override a method from
// its superclass
Classe abstraite
Il est possible de dfinir en Java des classes
ayant des mthodes abstraites
public interface List {
public boolean isEmpty();
public int size();
}

public abstract class AbstractList implements List {


public boolean isEmpty() {
return size()==0;
}
}

Une classe abstraite est une classe partiellement


implante donc non instanciable
Raffinement de l'abstraction
Une classe abstraite peut s'intercaler
dans l'arbre d'hritage entre l'interface et
les classes concrtes <<interface>>
Vehicle

<<interface>>
Vehicle
Cycle

BiCycle MotoCycle
BiCycle MotoCycle

AVANT APRES
Intrt des classe abstraite

Permet de partager du code commun des


sous-classes
public abstract class Cycle implements Vehicle {
private Roue avant, arriere;
public void sautPerilleuxArriere() {
freinage(avant);
}
protected abstract void freinage(Roue roue);

Le code commun peut supposer la prsence


de certaine mthodes (donc abstraites)
La classe Objet

Toutes les classes hritent de java.lang.Object


directement ou indirectement.
Un objet en Java possdent donc par hritage
toute les mthodes dfinies dans la classe Object

public class ClassExample {


public static void main(String[] args) {
Truc truc=new Truc();
Object o=truc;
}
}

Toute classe est un sous-type de Object


Classe et Objet
La mthode getClass() sur un Object permet
d'obtenir un objet de type Class reprsentant
la classe de l'objet
public class ClassExample {
public static void main(String[] args) {
String s="toto";
Object o="tutu"; // sous-typage
System.out.println(o.getClass()); //
java.lang.String
boolean test=s.getClass()==o.getClass();
System.out.println(test); // true
}
}

Lobjet de type Class permet de rechercher


les membres d'un objet par leur nom
Test dynamique de type
Il est possible de tester si un objet est un sous-
type d'un type particulier grce l'oprateur
instanceof

public class ClassExample {


public static void main(String[] args) {
Object o;
if (args.length!=0)
o=args[0];
else
o=new Object();
boolean test=o instanceof String;
System.out.println(o); // true ou false
}
}
Le transtypage

On appelle transtypage le fait de voir une


rfrence sur un type comme une rfrence
sur un sous-type
public class ClassExample {
public static void main(String[] args) {
Object o;
if (args.length==0)
o="tutu";
else
o=new Object();
String s=(String)o;
// peut faire l'excution un ClassCastException
}
}

Attention cette opration peut lever une


exception ClassCastException
Assurer le transtypage
Il est possible d'assurer un transtypage
sans lever d'exception en utilisant
instanceof
public class ClassExample {
public static void main(String[] args) {
Object o;
if (args.length!=0)
o=args[0];
else
o=new Object();

if (o instanceof String) {
String s=(String)o;
doSomeStuff(s);
}
}
}
Mauvais usage du instanceof
Le instanceof ne doit pas se
substituer au polymorphisme
public static void renderLoop(GItem[] items) {
begin(); GItem
for(GItem item:items) {
if (item instanceof Circle)
renderCircle((Circle)item);
else Circle Triangle
renderTriangle((Triangle)item);
}
end();
}

Moins maintenable, et si grosse hirarchie,


beaucoup moins performant
Utiliser le polymorphisme !

GItem dfinie une mthode abstraite render,


Circle et Triangle l'implante
public static void renderLoop(GItem[] items) {
begin();
for(GItem item:items) {
render (item);
}
end();
}

GItem

Circle Triangle
Note sur le transtypage

Utilisation classique du transtypage :


Les containers gnrique utilisent Object
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("toto");
String s=(String)list.get();
}

Le transtypage n'est pas necessaire en 1.5


public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
list.add("toto");
String s=list.get();
}

Vous aimerez peut-être aussi