Académique Documents
Professionnel Documents
Culture Documents
Pour spécifier qu'une classe dérive d'une autre classe, Le transtypage d'un objet d'un type vers un autre type
on utilise l'opérateur extends lors de la déclaration de permet de modifier la façon dont on "voit" l'objet mais
la classe: ne le modifie pas. Pour transtyper un objet vers un
autre type, la notation est la même que pour le cast
class Voiture extends Vehicule{ primitif: (MaClasseDestination)monObjet
} Il est possible de transtyper un objet vers un type
ascendant ( le type de sa classe mère ou la mère de
La classe mère commune à toutes les autres classes sa mère etc...) même si ce transtypage est fait de
est la classe Object. Tous les objets dérivent façon implicite. En effet, un objet Voiture par exemple
implicitement d'Object et les déclarations suivantes est implicitement un Vehicule - nul besoin de le
sont identiques: transtyper en Vehicule pour accéder à ses propriétés et
méthodes.
class Voiture{
} Dans certains cas cependant, il peut se trouver que les
méthodes ou les propriétés portent le même nom dans
la classe et dans ses classes ascendantes. Il existe
class Voiture extends Object{ alors des règles précises. Observons l'exemple
} suivant:
class Vehicule{
Types et affectation int iAge=10;
int getAge(){
Si mere est de type 'Mere' et fille de type 'Fille ' et que return iAge;
la classe Fille dérive de la classe Mere, }
}
Fille fille=new Fille();
Mere mere=new Mere(); class Voiture extends Vehicule{
int iAge=20;
faire int getAge(){
return iAge;
}
mere=fille;
}
signifie que la référence mere est maintenant une
Instancions un objet de type Voiture: Voiture v1=new
référence sur objet de type Fille et plus sur Mere. Cette
Voiture();
opération est acceptée car l'objet fille était de type
Mere par héritage.
Il est possible de transtyper v1 en Vehicule pour
accéder à la propriété iAge de la classe Vehicule et
mere instanceof Fille; renverra vrai.
non celle de Voiture:
En conséquence, mere peut maintenant appeler des
((Vehicule)v1).iAge pointe vers le iAge de Voiture.
méthodes de la classe Fille. A contrario, il est
impossible de faire :
A contrario, il n'est pas possible d'accéder à la
méthode getAge() de la classe Vehicule à partir de v1:
fille=mere;
1
ENI Concepts de POO en Java RV 2
2
ENI Concepts de POO en Java RV 3
Prog50.java
Canin.java
Chien.java
public Chien(){
Felin.java
Lion.java
public abstract class Felin extends Animal {
void deplacement() { public class Lion extends Felin {
System.out.println("Je me déplace seul !");
} public Lion(){
4
ENI Concepts de POO en Java RV 5
}
3. INTERFACES
public Lion(String couleur, int poids){
this.couleur = couleur;
this.poids = poids; Notion d'héritage multiple via interface
}
Définition
void crier() {
System.out.println("Je rugis dans la savane !");
} Certains langages orientés objet comme le C++
} disposent de l'héritage multiple: une classe peut dériver
de plusieurs classes. Ce concept peut amener à des
incohérences dans certains cas. D'autres langages
comme Java n'acceptent que l'héritage simple.
Tigre.java
Cependant, il peut être intéressant dans certains cas
d'hériter de méthodes ou de propriétés communes à
public class Tigre extends Felin { deux classes mères ou à leur ascendance. Pour
contourner ce problème, nous disposons des
public Tigre(){ } interfaces. Une interface est une sorte de classe de
public Tigre(String couleur, int poids){ déclaration dans laquelle les méthodes sont
this.couleur = couleur; seulement déclarées et les constantes fixées.
this.poids = poids; Cependant, dans une interface, il n'y a aucune
} implémentation. Toute classe ne peut dériver que d'une
classe mère mais implémenter une ou plusieurs
void crier() { interfaces. Si elle implémente une interface, elle doit
System.out.println("Je grogne très fort !"); implémenter toutes les méthodes de l'interface ou alors
} être abstraite.
}
Composition d'une interface
Une classe déclarée abstraite n'est pas « instanciable Création d'une interface
», mais rien ne l'oblige à comprendre des méthodes [<modificateurs d'accès>] interface PropriétéPrivée{
abstraites. boolean maMethode(int i);
int autreMethode(float f);
Code : Java - Sélectionner static final int i=10;
1 public class Test { }
2 public static void main(String[] args) {
3 Loup l = new Loup("Gris bleuté", 20);
Implémentation d'une interface
4 l.boire();
class Voiture implements PropriétéPrivée{
5 l.manger();
boolean maMethode(int i){
6 l.deplacement();
.....
7 l.crier();
}
8 System.out.println(l.toString());
int autreMethode(float f){
9 }
...
10 }
5
ENI Concepts de POO en Java RV 6
} void rouler();
}
void freiner();
Remarques : }
6
ENI Concepts de POO en Java RV 7
Dans cet exemple, nous avons donné deux public class Rectangle8
implémentation de Vehicule. extends Rectangle7
Conséquences : implements Dessinable1 {
public Rectangle8(double x, double y, double la, double lo)
• Ces 2 objets peuvent être vus comme des {
véhicules, c'est ce qu'on appelle le super(x,y,la,lo);
olymorphisme. }
• Par ce biais, on introduit une couche public void dessiner(Graphics g) {
d'abstraction dans notre programmation ce qui g.drawRect((int)posX, (int)posY,
la rend beaucoup plus flexible. (int)largeur, (int)hauteur);
}
Discussion }
Exemple 1
Dessinable1.java
import java.awt.Graphics;
public interface Dessinable1 {
public void dessiner(Graphics g);
}
7
ENI Concepts de POO en Java RV 8
8
ENI Concepts de POO en Java RV 9
MaClasse() ; }
x.f() ; c.m(mc) // la méthode m va
} appeler la méthode f définie Exemple 1
} dans maClasse.
package horloge;
import java.awt.*;
4. CLASSES INTERNES import java.awt.event.*;
import java.text.DateFormat;
import java.util.Date;
Une classe est dite interne lorsque sa définition est import javax.swing.*;
située à l'intérieur de la définition d'une autre classe.
Trois raisons justifient l'emploi de classes internes : public class Fenêtre extends JFrame {
private JLabel heure = new JLabel();
1. Les méthodes des classes internes peuvent public Fenêtre() {
accéder aux attributs de la classe conteneur, à super("Horloge");
partir de l'envergure où elles sont définies, y setBounds(100, 100, 180, 80);
compris les attributs qui pourrait être des setDefaultCloseOperation(EXIT_ON_CLOSE);
données privées. heure.setFont(new Font("Arial",
2. Les classes internes peuvent être cachées aux Font.BOLD+Font.ITALIC, 32));
autres classes du même paquetage, ce qui heure.setHorizontalAlignment(JLabel.CENTER);
offre une meilleure protection sur des données add(heure);
sensibles. setResizable(false);
3. Les classes internes anonymes sont utiles setVisible(true);
pour définir des callbacks (des appels de new Minuteur();
méthode automatique) sans écrire beaucoup }
de code.
public static void main(String[] args) {
Une classe interne possède les mêmes attributs de new Fenêtre();
visibilité qu'une variable ou une méthode (public, }
private, etc). Elle a un accès complet sur tous les
attributs des ses classes englobantes. private class Minuteur implements ActionListener {
Une classe interne peut être définie comme membre private Timer minuteur = new Timer(1000, this);
d'une classe , ou à l'intérieur d'une méthode public Minuteur() {
minuteur.start();
1) comme membre d’une classe }
public void actionPerformed(ActionEvent e) {
public class classe1 { heure.setText(DateFormat.getTimeInstance(Date
// attributs1 Format.MEDIUM).format(new Date()));
// constructuer1 }
classe1 (…..) }
{ }
……. La classe Minuteur est une classe interne, qui plus est,
Classe2 p2= new Classe2(..) ; privée. Seule les classes internes peuvent être privées.
// new Classe2(..) ; Il est donc impossible à l'extérieur de la classe Fenêtre
} d'atteindre la classe Minuteur et d'en créer une
instance.
// methodes 1
void methode1 (….)
{
……. 2) à l’intérieur d’une méthode (Classe interne
Classe2 p2= new Classe2(..) ; locale) pour protéger encore plus votre code
// new Classe2(..) ; source, et lorsque vous avez besoin d'une
} seule instance de la classe interne, il est
également possible de définir les classes
public class classe2 { localement à l'intérieur d'une seule méthode.
// attributs2
// constructeur2
// methode 2 pouvant accéder aussi à tous les attributs public class classe1 {
de la classe englobante Classe1 // attributs1
} // Fin Classe2 private int x ;
9
ENI Concepts de POO en Java RV 10
// constructuer1 heure.setText(DateFormat.getTimeInstance(Da
classe1 (…..) teFormat.MEDIUM).format(new Date()));
{ if (beep) Toolkit.getDefaultToolkit().beep();
……. }
methode1(….); }
new Minuteur();
} }
}
// methodes 1
void/type methode1 (….)
{ Exemple 3 ( classe interne locale)
…….
public class classe2 { import java.util.*;
// attributs2
// constructeur2 interface Personne {
// methode 2 public String identite();
} // Fin Classe2 }
return resultat;
}
13
ENI Concepts de POO en Java RV 14
Remarque importante :
14