Vous êtes sur la page 1sur 5

S.

Laporte JAVA: Dfinir et instancier une classe Lyce Louise Michel BTS IG DA
1
D D f fi in ni ir r e et t I In ns st ta an nc ci ie er r u un ne e c cl la as ss se e e en n J Ja av va a

Dclaration et Implmentation d'une classe

En algorithmique (comme en C++ la plupart du temps), l'criture du corps des mthodes
(implmentation) se fait aprs la dclaration de la classe. En java au contraire, l'implmentation et
la dclaration de la classe ne peuvent pas tre spares.

Etudions la syntaxe de la dfinition d'une classe en Java travers l'exemple compte:

class Compte
{
//attributs
private int numero;
private String nom;
private double solde;

//dfinition des mthodes
public void Init(int UnNumero, String UnNom)
{
numero = UnNumero;
nom = unNom;
solde = 0;
}
public void Crediter(double Montant)
{
solde = solde + Montant;
}
public void Debiter(double Montant)
{
solde = solde Montant;
}
public double GetSolde( )
{
return solde;
}
} //fin de la classe

Chaque membre (attribut ou mthode) est prcd par un modificateur d'accs private ou public
- private veut dire que le membre est encapsul, inaccessible de l'extrieur de l'objet
- public veut dire que le membre fait partie de l'interface , accessible de l'extrieur
(Remarque: il existe d'autres modificateurs que l'on verra plus tard)

Passage de paramtres:
en Java, les variables de type primitif sont toujours passes par valeur et les objets sont toujours
passs par rfrence. Il n'y a pas de signe indiquant la nature du passage de paramtre.


S. Laporte JAVA: Dfinir et instancier une classe Lyce Louise Michel BTS IG DA
2
Gestion des variables simples et des objets

En java, il existe trois types de variables :
- les variables primitives quon qualifiera simples qui sont de lun des 8 types
primitif (char, short, int, byte, float, long, double, boolean)
- les objets, cest--dire les variables dont le type est une classe
- les rfrences aux objets, qui sont des sortes de pointeurs

Les variables simples contiennent directement leur valeur. Elles sont dclares simplement dans la
pile. (Remarque: en Java, on ne peut pas construire de variables simples dans le tas.)

variable



Les objets en revanche sont contenu dans le tas (impossible de les dclarer dans la pile). Ils ne sont
pas dclars mais allous dynamiquement. Pour y accder, il faut passer par un pointeur spcial
quon appelle rfrence. Une rfrence est donc un pointeur qui dsigne un objet et qui permet de
le manipuler. (Remarque : il est impossible de dfinir une rfrence une variable simple ou une
autre rfrence, contrairement au C++). Une rfrence est dclare dans la pile.

rfrence



objet






Au niveau de leur manipulation, rfrences et pointeurs sont totalement diffrents. Utiliser une
rfrence est bien plus simple que dutiliser un pointeur. En fait, une fois l'instanciation ralise,
une rfrence peut quasiment tre confondue avec l'objet qu'elle dsigne.
- on ne peut pas accder l'adresse mmorise dans une rfrence (pas d'oprateur &,
pas d'arithmtique sur les pointeurs)
- pour accder l'objet rfrenc, il n'y a pas de drfrencement raliser (pas
d'oprateur * ni ->). L'accs l'objet est direct par sa rfrence.

Cest une des raisons majeures pour lesquelles Java est plus simple que C++.

Instanciation

Rappelons qu'un objet est une instance de classe et que l'instanciation consiste crer un objet
partir d'une classe (comme faire un gteau partir d'un moule). Une classe peut bien entendu servir
crer plusieurs instances (objets).

valeur
Valeurs des
attributs de
lobjet
S. Laporte JAVA: Dfinir et instancier une classe Lyce Louise Michel BTS IG DA
3
Comme les objets sont contenus dans le tas, on ne peut pas dclarer un objet comme on dclare
une variable simple. Un objet en Java doit toujours tre cr dynamiquement avec loprateur
new. Il faut dabord dclarer une rfrence un objet du type voulu puis crer (construire) lobjet
grce loprateur new, comme en C++.

Ex:
Soit une classe Personne
Voil comment crer un objet toto de type Personne.

Personne toto; //toto est une rfrence sur un objet de classe Personne
toto = new Personne( ); //un nouvel objet de type Personne est cr
//et l'adresse du nouvel objet est affecte toto

On pourrait simplifier lcriture en une seule ligne :
Personne toto = new Personne( );


En C++, on dclarerait un pointeur pour crer dynamiquement un objet:

Personne * toto;
toto = new Personne( ); //ou en une ligne : Personne* toto = new Personne( ) ;

Voyez la grande ressemblance entre les deux critures: la seule diffrence c'est qu'en C++, la
variable toto est prcde d'une * pour spcifier que c'est un pointeur sur une Personne. Et ensuite,
en C++, il faudrait drfrencer le pointeur (par * ou ->) afin daccder lobjet. Rien de tel en
Java.

En Java, il n'y a pas d'oprateur spcial pour signifier que la variable dclare est une
rfrence. Cest le compilateur qui reconnat sil sagit dune variable simple ou dune rfrence :
- si le type est primitif, la variable dclare est simple et contenue dans la pile
- si le type est une classe, automatiquement la variable dclare est une rfrence sur un
objet de la classe et il faudra ensuite construire un objet qui sera dsign par cette
rfrence.

Nous avons dit qu'une fois instancis, un objet peut tre confondu avec sa rfrence. En ralit, il
faut toujours avoir en tte que ce que l'on manipule, ce sont des rfrences des objets et pas
directement les objets. Ainsi il faut se mfier, notamment lorsqu'on veut copier un objet dans un
autre objet. Si on ralise une simple affectation, on ne va pas crer une copie mais on va faire
pointer une autre rfrence sur le mme objet!

Ex:
Compte UnCompte;
Compte UnAutreCompte;
UnCompte = new Compte;
UnAutreCompte = UnCompte;





S. Laporte JAVA: Dfinir et instancier une classe Lyce Louise Michel BTS IG DA
4
Les constructeurs

Rappel:
Un constructeur est une mthode particulire qui est appele automatiquement la cration d'un
objet et qui permet d'initialiser correctement cet objet.

En java, les objets ne peuvent tre cres que par allocation dynamique. Le constructeur est appel
lors de l'allocation de l'objet par new (et non lors de la dclaration de la rfrence).

Un constructeur se reconnat facilement en Java:
- il porte le mme nom que la classe
- il n'a pas de type de retour (mme pas void)

On peut videmment dfinir plusieurs constructeurs pour une mme classe, s'ils ont une signature
diffrente.

Modification de la classe compte : la mthode Init est remplace par deux constructeurs:

class Compte
{
//attributs
private int numero;
private String nom;
private double solde;

//dfinition des mthodes
public Compte(int UnNumero, String UnNom) //premier constructeur
{
numero = UnNumero;
nom = unNom;
solde = 0;
}

public Compte (int UnNumero, String UnNom, double SoldeInitial) //deuxime constructeur
{
numero = UnNumero;
nom = unNom;
solde = SoldeInitial;
}
public void Crediter(double Montant)
{
solde = solde + Montant;
}
public void Debiter(double Montant)
{
solde = solde Montant;
}
public double GetSolde( )
{
return solde;
}
} //fin de la classe

S. Laporte JAVA: Dfinir et instancier une classe Lyce Louise Michel BTS IG DA
5
Pour crer un compte, on a deux manires

Compte cpte1 = new Compte(135, "Dupont"); //instanciation avec appel du premier constructeur
Compte cpte2 = new Compte(159, "Martin", 1500); //instanciation avec appel du 2 constructeur

Si aucun constructeur n'est dfini explicitement, le compilateur en cr un quand mme. Ce
constructeur dfini par dfaut ne comporte pas de paramtres et initialise tous les attributs leur
valeur nulle (0 pour les variables numriques, NULL pour les rfrences, "" pour les chanes de
caractre, ).
Mais ds lors qu'un constructeur est dfini explicitement, le compilateur n'en cr pas d'autre.
L'utilisateur est oblig, l'instanciation, de passer les paramtres requis par l'un des constructeurs
explicite. Mais le concepteur de la classe peut crer son propre constructeur par dfaut (c'est--dire
sans paramtres).

Mme lorsque l'instanciation ne comporte aucun paramtre (appel du constructeur par dfaut s'il
existe), il faut mettre les parenthses.

Ajoutons un constructeur par dfaut la classe Compte

public Compte() // constructeur par dfaut
{
numero = 0;
nom = "inconnu";
solde = 0;
}

On peut alors instancier un objet de type Compte de la faon suivante:

Compte un_compte = new Compte( );


Instanciation d'un objet =
dclaration de la rfrence + allocation en mmoire + construction (appel d'un constructeur)