Cours Java
1 Ph. CHOCHOIS
Notion d’objet et de classe
Types primitifs
Java propose 9 types primitifs, leur nom est entièrement en minuscule :
int, boolean, char, byte, float, double, long, short, void
Remarque: les chaînes (String) n’en font pas partie.
2
Types primitifs
3
Objets
Java est un langage Objet.
Il permet de manipuler les types simples…
… et les types complexes: Les objets
Définition: Un objet est une entité du monde réel (une table, une voiture, un employé, un produit…) ou virtuel (une facture, une location, une idée, un conteneur, un écouteur, une exception …) qui se caractérise par un ensemble de propriétés, des états significatifs et un comportement.
L’état d’un objet correspond aux valeurs de tous ses attributs à un instant donné.
Le comportement d’un objet est caractérisé par l’ensemble des opérations qu’il peut exécuter en réaction aux messages provenant des autres objets.
4
Objets
Exemple: L’employé Durand n°12345 embauché en tant qu’ ingénieur travaillant sur le site de Bordeaux.
Quels sont ses propriétés, son état, son comportement ? Propriétés: nom, numéro, poste occupé, lieu de travail
Etat: Il s’appelle Durand, a le numéro 12345 , est ingénieur et travaille à Bordeaux
Comportement: Il peut être muté, quitter l’organisme, changer de qualification…
.
Concept de Classe
Une classe est l’abstraction d’un ensemble d’objets qui possèdent une structure identique (attributs) et un même comportement (opérations, méthodes).
Un objet est une instance d’une et d’une seule classe.
Les concepts d’objet et de classe sont interdépendants.
Concept de Classe
Exemple:
Nom de classe: Employe Attributs:
numero
nom qualification site de travail Opérations:
Modifier un employé Départ d’un employé Consulter un employé
7
Encapsulation et interface
L’approche Objet se caractérise par le regroupement dans une même classe de:
La description de la structure des attributs La description des opérations
Ce regroupement porte le nom d’encapsulation données-traitements.
Le principe d’encapsulation renforce l’autonomie et l’indépendance de chaque classe et augmente la potentialité de classe réutilisable.
L’ensemble des opérations rendues visibles aux autres classes porte le nom d’interface.
Les opérations non visibles sont des opérations privées (private) Sauf cas exceptionnel, les attributs sont privés. On y accède grâce à
des méthodes publiques.
8
Encapsulation et Interface
9
Classe N
Opérations accessibles -Opération 1 -Opération 2 - Opération 3 -…/…
Opérations non accessibles -Opération A -Opération B -…/…
Données:
-Attribut 1 -Attribut 2 -Attribut 3 -…/…
Interface
Accès aux données via l’interface (Partie visible de la classe)
Exercices d’application
Nous allons créer des classes et des objets à l’aide du langage Java.
Pour faciliter notre travail, nous allons utiliser un IDE (« Integrated Development Environment » ou « Environnement de développement intégré ») : Eclipse.
1.Sous Linux, lancer Eclipse en saisissant « Eclipse » dans un terminal 2.Créer un nouveau projet
3.Créer une nouvelle classe nommée « UtiliseVoiture » en cochant la case
« public static void main (String [ ] args) »
Question subsidiaire: Pourquoi cet IDE se nomme Eclipse ?
10
Exercices d’application
Complétez votre programme Java « UtiliseVoiture .java » permettant de déclarer une variable de type entier « int ».
•Exécutez votre programme grâce à :
• Run
• Run as …… Java Application
Eclipse doit indiquer « terminated », c’est à dire que le programme s’est terminé correctement mais il n’a rien fait
public class UtiliseVoiture {
public static void main(String args[]){
int unEntier;
} }
Exercices d’application
Complétez le programme précédent pour déclarer une variable de type
« Voiture ». Que se passe t-il et pourquoi ?
public class UtiliseVoiture{
public static void main(String args[]){
int unEntier;
Voiture uneVoiture ; }
}
Complétez le programme précédent pour déclarer une variable de type
« Voiture ». Que se passe t-il et pourquoi ?
13 public class UtiliseVoiture{
public static void main(String args[]){
int unEntier;
Voiture uneVoiture ; }
}
La compilation échoue car le type « Voiture » est inconnu. On ne peut pas créer d’objet « Voiture ».
Pour pouvoir créer un objet « Voiture », il faut décrire ce qu’est une voiture.
Exercices d’application
Créer une nouvelle classe Voiture avec les propriétés privées marque, couleur, année et NumeroSerie.
Ne cochez pas cette fois-ci « public static void main (String [ ] args) »
14 public class Voiture{
private int numSerie;
private String marque;
private String couleur;
private int annee;
}
Ce code source java ne peut pas être exécuté. Un voiture n’est pas exécutable en tant que telle. La classe Voiture n’a été créée que pour définir des objets de type « Voiture ».
Tous les objets qui seront créés en ayant le type « Voiture » posséderont toutes les caractéristiques que nous avons écrites dans la classe « Voiture ».
Le programme « UtiliseVoiture » peut maintenant être exécuté.
Exercices d’application
En utilisant la classe « Voiture », créer 2 voitures dans votre programme
« UtiliseVoiture ».
15 public class UtiliseVoiture{
public static void main(String args[]){
int unEntier;
Voiture uneVoiture;
uneVoiture = new Voiture();
Voiture uneAutreVoiture =new Voiture();
} }
Question : Est-il possible d’afficher de quelle couleur sont nos 2 voitures ?
Exercices d’application
Fournir le code permettant de créer la classe Produit avec les propriétés privées nomProduit et prix.
16 public class Produit {
private String libelle;
private double prix;
}
Exercices d’application
Créer un produit dans un programme « UtiliseProduit » qui crée un produit.
public class UtiliseProduit { public static void main(String args[]){
Produit p;
p = new Produit();
} }
Exercices d’application
Dans ce cas, nous avons créé un produit « p ». Il n’a pas de nom, ni de prix.
Créer maintenant un produit qui porte le nom « Chocolat » et qui a un prix de 1,50 euro.
Exercices d’application
Afin de pouvoir affecter des valeurs aux propriétés privées des produits, il faut créer des méthodes publiques qui vont accéder elles-mêmes aux propriétés privées du produit.
Ces méthodes sont à écrire dans la classe « Produit ».
Ces méthodes particulières qui permettent d’affecter une valeur à une propriété s’appellent des « setteurs » ou « modificateurs ». On les nomme généralement de la façon suivante
« setNomPropriété ».
Exemple : Le setteur qui valorise le libellé s’appellera
« setLibelle »
Créer maintenant un produit qui porte le nom « Chocolat » et qui a un prix de 1,50 euro.
19
Exercices d’application
Les setteurs permettent de mettre à jour une propriété d’un objet à partir d’une information qu’ils reçoivent. Le nom et le type de paramètre reçu doit être indiqué comme paramètre en entrée du setteur.
Exemple : Pour le setteur « setLibelle » qui permet de mettre à jour le libellé d’un produit, il faut déclarer un paramètre nommé
« unLibellé » qui est de type « String », c'est-à-dire une chaîne de caractères
setLibelle(String unLibelle)
Créer maintenant un produit qui porte le nom « Chocolat » et qui a un prix de 1,50 euro.
20
Exercices d’application
Les setteurs reçoivent un paramètre mais ne retournent aucune information à celui qui leur envoie ce paramètre. Le type particulier qui indique « Rien » se nomme « void ».
Toutes les méthodes doivent indiquer le type d’information retournée.
Dans notre exemple, on écrira : void setLibelle(String unLibelle)
Créer maintenant un produit qui porte le nom « Chocolat » et qui a un prix de 1,50 euro.
21
Exercices d’application
Afin de pouvoir être appelé, le setteur doit être déclaré « public » Dans notre exemple, on écrira donc : public void
setLibelle(String unLibelle)
Créer maintenant un produit qui porte le nom « Chocolat » et qui a un prix de 1,50 euro.
22
Exercices d’application
Le contenu des actions à exécuter lors de l’appel d’une méthode est délimité par des accolades.
Dans notre exemple, on écrira donc : public void setLibelle(String unLibelle){
}
Créer maintenant un produit qui porte le nom « Chocolat » et qui a un prix de 1,50 euro.
Exercices d’application
Le setteur doit récupérer la valeur du paramètre reçu en entrée (unLibelle) et l’affecter à la propriété adéquate (Libelle). Afin de bien préciser qu’on affecte la valeur reçue à la propriété du produit et à pas à une variable quelconque, on peut faire précéder le nom de la propriété par le mot clé « this »
Dans notre exemple, on écrira donc : public void setLibelle(String unLibelle){
this.libelle = unLibelle ; }
Remarque : toutes les instructions se terminent par un point virgule.
Créer maintenant un produit qui porte le nom « Chocolat » et qui a un prix de 1,50 euro.
public class Produit{
private String libelle;
private double prix;
public void setLibelle(String unLibelle){
this.libelle = unLibelle;
}
public void setPrix(double unPrix){
this.prix = unPrix;
} }
Exercices d’application
Eclipse est capable de générer des setteurs standards automatiquement.
Choisissez:
•Source
•Generate getters and setters…
25 public class Produit{
private String libelle;
private double prix;
public void setLibelle(String unLibelle){
this.libelle = unLibelle;
}
public void setPrix(double unPrix){
this.prix = unPrix;
} }
Exercices d’application
Créer maintenant votre produit « Chocolat » à 1,50 euro.
Nous utilisons la notation pointée pour appeler les méthodes publiques du produit
« p ». Il est obligatoire de transmettre les valeurs attendues par les méthodes.
Ici, la méthode « setLibelle » attend une chaîne de caractères en entrée ; on lui fournit donc la chaîne « Chocolat ».
La méthode « setPrix » attend un réel en entrée ; on lui fournit donc le nombre
« 1.50 ».
Remarque : Contrairement aux chaînes de caractères, les nombres ne sont pas encadrées par des guillemets.
26 public class UtiliseProduit{
public static void main(String args[]){
Produit p;
p = new Produit();
p.setLibelle("Chocolat");
p.setPrix(1.50);
} }
Exercices d’application
Nous avons donc maintenant créé un produit qui a pour libellé
« Chocolat » et pour prix « 1.50 ».
Maintenant, essayons d’afficher notre produit.
Puisque nous ne pouvons pas accéder aux propriétés privées, il va falloir créer des méthodes publiques qui vont accéder à ces propriétés.
Contrairement aux setteurs, ces méthodes ne reçoivent aucune information mais en retournent. On appelle ces méthodes des « getteurs » ou des « accesseurs ».
Modifions donc notre classe Produit pour lui créer 2 getteurs
27 public class Produit{
private String libelle;
private double prix;
public void setLibelle(String unLibelle){
this.libelle = unLibelle;
}
public void setPrix(String unPrix){
this.prix = unPrix;
}
public String getLibelle(){
return this.libelle;
}
public String getPrix(){
return this.prix;
} }
Exercices d’application
Affichons maintenant notre produit.
28 public class UtiliseProduit{
public static void main(String args[]){
Produit p;
p = new Produit();
p.setLibelle("Chocolat");
p.setPrix(1.50);
System.out.println("Notre
produit "+p.getLibelle()+" coute "+p.getPrix());
} }
Exercices d’application
Affichons maintenant notre produit dans une boîte de dialogue.
public class UtiliseProduit{
public static void main(String args[]){
Produit p;
p = new Produit();
p.setLibelle("Chocolat");
p.setPrix(1.50);
javax.swing.JOptionPane.showMessageDialog(null,"Notre produit "+p.getLibelle()+" coute "+p.getPrix());
} }
Exercices d’application
Modifiez votre classe « Produit » afin que le programme ci-dessous fonctionne. Le produit doit être capable d’afficher ses propriétés lorsqu’on lui demande de s’afficher. Il doit donc être doté de la méthode affiche.
public class UtiliseProduit{
public static void main(String args[]){
Produit p;
p = new Produit();
p.setLibelle("Chocolat");
p.setPrix(1.50);
p.affiche();
} }
Exercices d’application
Modifiez votre classe « Produit » afin que le programme ci-dessous fonctionne. Le produit doit être capable d’afficher ses propriétés lorsqu’on lui demande de s’afficher. Il doit donc être doté de la méthode affiche.
.
31 public class UtiliseProduit{
public static void main(String args[]){
Produit p;
p = new Produit();
p.setLibelle("Chocolat");
p.setPrix(1.50);
p.affiche();
} }
_______________________________________________________________
public class Produit{
private String libelle;
private double prix;
…/…
public void affiche(){
System.out.println("Notre produit "+this.libelle+"
coute "+this.prix);
} }
Exercices d’application
Modifiez votre classe « Produit » afin que le programme ci-dessous fonctionne. Le produit doit être capable de retourner une chaîne de caractères contenant les informations le concernant. Il doit donc être doté de la méthode « toString ».
Cette façon de faire est la meilleure des 3 car la classe métier (classe produit) est dissociée de la classe applicative (UtiliseProduit). De cette manière, la classe Produit peut être ré-utilisée quelque soit le traitement (mode console, mode graphique, traitement batch, wap…)
.
32
public classUtiliseProduit {
public static voidmain(String args[]) { Produit p;
p = newProduit();
p.setLibelle("Chocolat");
p.setPrix(1.50) ;
System.out.println(p.toString());
}}
Exercices d’application
Modifiez votre classe « Produit » afin que le programme ci-dessous fonctionne. Le produit doit être capable de retourner une chaîne de caractères contenant les informations le concernant. Il doit donc être doté de la méthode « toString ».
Cette façon de faire est la meilleure des 3 car la classe métier (classe produit) est dissociée de la classe applicative (UtiliseProduit). De cette manière, la classe Produit peut être ré-utilisée quelque soit le traitement (mode console, mode graphique, traitement batch, wap…)
.
33
public classProduit { privateString libelle;
private doubleprix;
…/…
publicString toString(){
return"Notre produit "+this.libelle+" coute "+this.prix ; }
}
Exercices d’application
Exemple d’utilisation de propriété publique :
Ajouter une propriété publique « alimentaire » de type booléen. La propriété « alimentaire » ne pourra prendre que les valeurs « true » ou
« false ».
34
classProduit { privateString libelle;
private doubleprix;
public booleanalimentaire;
public voidsetLibelle(String unLibelle){
this.libelle = unLibelle ; }
public voidsetPrix(doubleunPrix){
this.prix = unPrix ; }
publicString toString(){
return"Notre produit "+this.libelle+" coute "+this.prix ; }
}
Exercices d’application
Exemple d’utilisation de propriété publique :
Modifiez le programme « UtiliseProduit » pour permettre de dire que le chocolat est un produit alimentaire et d’afficher un message indiquant si le produit est alimentaire après avoir lu cette propriété.
public classTest {
public static voidmain(String args[]){
Produit p;
p = newProduit();
p.setLibelle("Chocolat");
p.setPrix(1.50);
p.alimentaire=true;
System.out.println(p.toString());
if(p.alimentaire)
System.out.println("Notre produit est un produit alimentaire");
else
System.out.println("Notre produit n’est pas un produit alimentaire");
} }
Exercices d’application
Exemple d’utilisation d’une méthode privée :
Créer une méthode privée dans la classe Produit permettant de convertir le montant en euros en montant en francs. Cette méthode n’affichera rien ; elle retourne un montant en francs à partir du prix du produit.
. classProduit {
privateString libelle;
private doubleprix;
public booleanalimentaire;
…/…
private doubleconversionEnFrancs(){
doublemontantFrancs=this.prix*6.55957;
returnmontantFrancs;
}
publicString toString(){
return"Notre produit "+this.libelle+" coute "+this.prix ; }
}
Exercices d’application
Exemple d’utilisation d’une méthode privée :
Essayez d’appeler cette méthode pour notre produit Chocolat. Que se passe t-il et pourquoi ?
.
37 public classTest {
public static voidmain(String args[]){
…/…
doubleprixFrancs=p.conversionEnFrancs();
} }
Exercices d’application
Exemple d’utilisation d’une méthode privée :
Une méthode privée peut être appelée à l’intérieur de la classe. Affichez le prix en francs grâce à la méthode « toString » en utilisant la méthode de conversion.
38 public class Produit {
private String libelle;
private double prix;
public boolean alimentaire;
…/…
private double conversionEnFrancs(){
double montantFrancs=this.prix*6.55957;
return montantFrancs;
}
public String toString(){
String chaine="Notre produit "+this.libelle+" coute "+this.prix ; chaine +=" euros, soit "+conversionEnFrancs()+" francs.";
return chaine;
} }
Exercices d’application
39
Les constructeurs…
Un constructeur est une méthode particulière qui est appelée automatiquement à la création d'un objet et qui permet d'initialiser correctement cet objet.
Le constructeur est appelé lors de l'allocation de l'objet par new (et non lors de la déclaration de la référence).
Un constructeur se reconnaît facilement en Java:
- il porte le même nom que la classe - il n'a pas de type de retour (même pas void)
On peut définir plusieurs constructeurs pour une même classe, s'ils ont une signature différente.
40
Les constructeurs: rôle et définition
Pour créer un compte, on a deux manières
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
Mais on ne peut pas écrire:
public class Compte{
private int numero;
private String nom;
private double solde;
public Compte(int UnNumero, String UnNom){ //1erconstructeur this.numero = UnNumero;
this.nom = unNom;
this.solde = 0;
}
public Compte (int UnNumero, String UnNom, double SoldeInitial){
//deuxième constructeur this.numero = UnNumero;
this.nom = unNom;
this.solde = SoldeInitial;
} }
Les constructeurs: Exemple
Si aucun constructeur n'est défini explicitement, le compilateur en créé un quand même.
Ce constructeur défini par défaut ne comporte pas de paramètres et initialise tous les attributs à leur valeur par défaut (0 pour les variables numériques, NULL pour les références, "" pour les chaînes de caractères, …).
Mais dès lors qu'un constructeur est défini explicitement, le compilateur n'en créé pas d'autre.
L'utilisateur est obligé, à l'instanciation, de passer les paramètres requis par l'un des constructeurs explicite. Mais le concepteur de la classe peut créer son propre constructeur par défaut (c'est-à-dire sans paramètres).
Même lorsque l'instanciation ne comporte aucun paramètre (appel du constructeur par défaut s'il existe), il faut mettre les parenthèses.
Exemple:
Compte cpte = new Compte();
Les constructeurs
On peut alors instancier un objet de type Compte de la façon suivante:
43 public Compte() // constructeur sans paramètre
{
this.numero = 0;
this.nom = "inconnu";
this.solde = 0;
}
Les constructeurs
Ajoutons un constructeur sans paramètre à notre classe Compte.
Compte unCompte = new Compte( );
Instanciation d'un objet = déclaration de la référence + allocation en mémoire + construction (appel d'un constructeur)