Académique Documents
Professionnel Documents
Culture Documents
class ProgrammeEtourdi{
class Tetris{ ...
... void faitErreur(Tetris t){
Piece creerNouvellePiece(){ Tetris t = ...
... t.creerNouvellePiece();
} t.creerNouvellePiece();
} }
}
2
class PileDeChaines{
// attributs
String[] pile;
// méthodes
void push(String s){
// ajouter s à la fin de pile
}
String top(){
// renvoyer le dernier élément de pile
}
String pop(){
// enlever le dernier élément de pile et le renvoyer
}
boolean estVide(){
// renvoyer vrai si la taille de pile est 0, faux sinon
}
}
class PileDeChaines{
// attributs
ArrayList<String> pile;
// méthodes
...
}
4
Par défaut, les attributs doivent être cachés. Leurs valeurs ne doivent être
visibles et modifiables qu'au travers des méthodes. Il est cependant
acceptable de laisser visible les constantes.
objet o1
méthodes objet o2
(accesseurs)
m1
attributs objet o3
m2
class ListeDeTruc{
...
// méthodes
void coupe(Truc pivot){
...
}
void trier(){
...
this.coupe(...);
...
}
...
}
6
En Java, il existe deux périmètres de visibilité: les classes et les paquetages.
java
Les noms des paquetages suivent la convention inverse des URI internet:
com.monlogiciel.paquetage2
Pour utiliser dans un fichier java une classe C d'un paquetagep, on peut:
class Truc{
...
- donner le nom de la classe in extenso: p.C variable = ...
...
}
import p.C;
import java.lang.*;
class Truc{
- ajouter une directive en tête du fichier : ...
C variable = ...
...
}
8
Pour organiser ses propres classes en paquetage:
- placer les classes dans un répertoire portant le nom souhaité
- mettre en tête de fichier la directive package correspondante
répertoire monpaquetage
10
Les 4 niveaux d'encapsulation de Java sont par ordre de visibilité croissante :
– un membre privé (private) n'est visible que dans les instances
directes de la classe où il est déclaré.
– un membre sans modifieur est visible uniquement dans les instances
directes de la classe où il est déclaré et dans celles des classes du
même paquetage.
– un membre protégé (protected) n'est visible que dans les instances,
directes ou non, de la classe où il est déclaré (et donc aussi dans les
instances des sous-classes) et dans les instances des classes du
même paquetage.
– un membre public (public) est visible par n'importe quel objet.
11
12
Les attributs doivent a priori être privés (ou au moins protégés). Si besoin, des
accesseurs et modifieurs publics sont définis et permettent de contrôler
l'accès aux attributs.
class Personne{
// attributs
private String nom;
private Vote v;
private int pointure;
private float fortune;
...
// methodes
public String getNom(){
return this.nom;
}
public int getPointure(){
return this.pointure;
}
public void donnerSous(float s){
this.fortune = this.fortune.s;
}
public float getFortune(Object o){
if(o instanceof Etat) return this.fortune;
}
}
13
La redéfinition d'une méthode doit avoir une visibilité au moins égale à celle
de la méthode de la super-classe. Cette contrainte est due à la liaison
dynamique.
14
Une méthode abstraite ne peut être privée car elle doit être implémentée dans
une sous-classe. Elle peut être implémentée par une méthode ayant une
visibilité plus large qu'elle-même.
15
Une classe (ou interface) déclarée public est visible de partout, sinon elle
n'est visible que dans son paquetage.
package monPaquetage;
Les classes qui ne sont pas déclarées dans un paquetage font toutes partie du
même paquetage «anonyme».
16
Une classe interne est une classe définie à l'intérieur d'une autre classe.
class A{
...
Une classe membre est définie au même niveau que class B{
...
les attributs et méthodes de la classe englobante. }
}
Une classe anonyme est définie à l'intérieur d'une Objet o = new B(){
...
expression. }
17
Une classe membre n'a donc de sens que si ses instances ne peuvent
exister que comme parties d'instances de la classe englobante.
class Feu{
...
class Fumee{
On peut imbriquer des classes sur autant de ...
class SignauxDeFumee{
niveaux que l'on veut. ...
}
}
}
18
Une classe membre a accès aux attributs et méthodes de la classe
englobante, même s'ils sont privés.
class A{
private int z;
19
class A{
class B{
class C{
...
}
...
}
...
public static void main(String[] t){
A instanceDeA = new A();
B instanceDeB = instanceDeA.new B();
A.B autreB = new B();
A.B.C unC = instanceDeB.new C();
}
}
20
L'héritage est totalement indépendant de l'imbrication de classe.
class Humain{
...
class Foetus extends Humain{
...
}
...
}
21
Une interface ou une classe abstraite peuvent être membres d'une classe.
class File {
interface FileParser {
boolean parse();
}
class CSVParser implements FileParser {
public void parse() {...}
}
class ODSParser implements FileParser {
public void parse() {...}
}
private FileParser fp;
public File(String name){
...
if(isCSV(name)) this.fp = new CSVParser();
if(isODS(name)) this.fp = new ODSParser();
...
}
}
22
Si la classe membre est déclarée statique, elle n'est pas liée à une instance
de la classe englobante.
Le mot clé this ne peut y être employé, donc la classe membre de classe n'a
pas accès aux attributs et méthodes non statiques de la classe englobante.
23
A.class
class A{
class B{
... compilation
}
... A$B.class
24
class A{
public void method(){
Une classe locale n'est visible que dans le class B{
...
bloc de code où elle est définie (elle est }
forcément «privée»). ...
}
}
Une classe locale définie dans une méthode d'instance a accès aux attributs et
méthodes de la classe englobante, même s'ils sont privés.
Une méthode locale définie dans une méthode de classe n'a accès qu'aux
membres de classes de la classe englobante.
25
class A{
Une classe locale ne peut utiliser une public void method(){
variable locale que si elle est déclarée final int i = ...
int j = ...
final. class B{
int k = i;
int l = j;
...
}
Une class locale ne peut être définie que ...
}
statique ou abstraite.
}
class A{
... A$1$B.class
void methode(){
class B{
Le compilateur crée pour ...
chaque classe locale un } compilation
...
fichier .class numéroté. class C{ A$2$C.class
...
}
}
...
}
26
Une classe locale ne sert pas vraiment à modéliser des données, mais
constitue une technique permettant de définir localement un type.
Le plus souvent, on utilise une classe locale pour spécialiser une classe
existante et réutiliser ainsi du code localement.
class Outil{
...
}
class BuveurDeVin{
public void deboucherBouteille(Bouteille b){
class TireBouchon extends Outil{
...
}
TireBouchon tb = new TireBouchon();
tb.debouche(b);
...
}
}
27
Une classe anonyme est une classe locale sans nom, définie dans une
instruction et instanciée dans la foulée.
interface ActionListener{
public void actionPerformed(ActionEvent ae);
}
class InterfaceGraphique{
public InterfaceGraphique(){
...
Button bouton ...
bouton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
...
}
};
...
}
...
}
Une classe anonyme ne peut être réutilisée, ne peut avoir qu'une seule
instance et n'a pas de constructeur (l'instance unique est créée avec le
constructeur par défaut).
28
Une classe anonyme n'autorise aucun modifieur et est toujours final
(implicitement).
Une classe anonyme subit les mêmes restrictions d'accès aux membres de la
classe englobante qu'une classe locale.
class A{
...
void methode(){
Le compilateur génère new class B(){
... A$1.class
pour chaque classe } compilation
...
anonyme un fichier }
...
.class numéroté. }
29