2024-12-05
Java est un langage fortement typé. Chaque variable et chaque expression a un type défini à la compilation.
Remarque : * Les types primitifs sont stockés directement dans la variable. * Les références stockent l’adresse mémoire de l’objet.
Les identificateurs sont les noms que nous attribuons aux différents éléments de notre code Java (classes, variables, méthodes, etc.).
int
, class
, public
).true
, false
ou null
.age
et Age
sont différents).Une constante est une valeur qui ne peut pas être modifiée une fois initialisée. Elles sont généralement déclarées avec le mot-clé final
.
L
(exemple: long MAX_VALUE = Long.MAX_VALUE;
)int MAX_INT = 2147483647;
)double PI = 3.14159;
)f
(exemple: float EPSILON = 1e-6f;
)char SEPARATEUR = ',';
)true
et false
(exemple: boolean EST_VALIDE = true;
)null
(indique une absence de référence)Un objet est une instance d’une classe. Il représente une entité réelle ou conceptuelle avec ses propres attributs (champs) et comportements (méthodes).
Une référence est une valeur qui pointe vers un objet en mémoire. Elle est stockée dans une variable.
null
, indiquant qu’elle ne pointe vers aucun objet.objet.champ
objet.methode()
(Type)objet
chaine + objet
(appelle objet.toString()
)objet instanceof Type
)==
compare les références (si elles pointent vers le même objet), !=
compare l’inverse.condition ? valeurSiVraie : valeurSi fausse
La classe Object
est la classe de base de toutes les classes en Java. Cela signifie que toutes les classes, même si vous ne les en faites pas explicitement hériter, héritent indirectement de Object
.
Object
ou de ses sous-classes.Class
représentant la classe de l’objet courant. Cette méthode est utilisée pour l’introspection, c’est-à-dire pour obtenir des informations sur la classe d’un objet à l’exécution.HashMap
.En Java, les variables sont utilisées pour stocker des données. Leur portée et leur durée de vie varient en fonction de leur type.
Type de variable | Portée | Durée de vie | Initialisation |
---|---|---|---|
Instance | Toute la classe | Par instance | Déclaration ou constructeur |
Classe | Toute la classe | Une fois par classe | Lors du chargement de la classe |
Locale | Bloc | Pendant le bloc | Déclaration |
Tableau | Tableau | Tant que le tableau existe | Lors de la création du tableau |
Paramètre de méthode | Méthode | Pendant la méthode | Passage d’arguments |
Paramètre de constructeur | Constructeur | Pendant le constructeur | Passage d’arguments |
Paramètre d’exception | Bloc catch | Pendant le bloc catch | Capture d’exception |
Pourquoi ? * Fiabilité. * Lisibilité. * Optimisation.
Exemple:
Les méthodes en Java peuvent être classées en différentes familles selon leur rôle et leur visibilité :
Définition: La surcharge consiste à définir plusieurs méthodes dans une même classe portant le même nom mais ayant des signatures différentes.
Signature d’une méthode: La signature d’une méthode est composée de : * Nom de la méthode: Le nom qu’on utilise pour appeler la méthode. * Liste des paramètres: Le nombre et le type des paramètres que la méthode prend en entrée.
Important: Le type de retour ne fait pas partie de la signature. Deux méthodes ne peuvent donc pas être surchargées uniquement en changeant leur type de retour.
public class Voiture {
// Instance variables
private String immatriculation; // Vehicle registration number
private String marque; // Brand
private boolean enMarche; // Running status
// Constructors
public Voiture(String immatriculation, String marque) {
this.immatriculation = immatriculation;
this.marque = marque;
this.enMarche = false; // Initialize running status to false
}
public Voiture(String immatriculation) {
this(immatriculation, "");
}
// Modifiers
public void setMarque(String marque) {
this.marque = marque;
}
// Accessors
public String getImmatriculation() {
return immatriculation;
}
public String getMarque() {
return marque;
}
public boolean isEnMarche() {
return enMarche;
}
// Methods
public void demarrer() {
if (!enMarche) {
enMarche = true;
System.out.println("La voiture démarre.");
} else {
System.out.println("La voiture est déjà en marche.");
}
}
public void arreter() {
if (enMarche) {
enMarche = false;
System.out.println("La voiture s'arrête.");
} else {
System.out.println("La voiture est déjà arrêtée.");
}
}
}
En Java, tous les paramètres sont passés par valeur.** Cela signifie qu’une copie de la valeur de chaque argument est transmise à la méthode appelée.
Cas particuliers des références
class Voiture {
private String immatriculation;
private String marque;
// ... constructeurs et getters/setters ...
}
public class Parametres {
public static void main(String[] args) {
Voiture uneVoiture = new Voiture("1234 AB 83");
uneVoiture.setMarque("Rolls-Royce");
// La méthode changeMarque modifie l'objet uneVoiture
changeMarque(uneVoiture);
System.out.println(uneVoiture); // Affiche toujours "Rolls-Royce"
// La méthode abandonner ne modifie pas la référence uneVoiture
abandonner(uneVoiture);
System.out.println(uneVoiture); // Affiche toujours l'objet, même si la référence locale a été mise à null
}
private static void abandonner(Voiture v) {
v = null; // Cette modification n'a pas d'effet sur uneVoiture
}
private static void changeMarque(Voiture v) {
v.setMarque("Fiat"); // Modifie l'objet uneVoiture
}
}
Variables de classe (statiques)
static
pour déclarer une variable appartenant à la classe elle-même plutôt qu’à une instance particulière.final
, elle devient une constante pour l’ensemble du programme.Méthodes de classe (statiques)
NomDeLaClasse.nomDeLaMethode()
).public class Chien {
// Attributs
private String tatouage; // Tatouage unique du chien
private String nom; // Nom du chien
private static int nbChiens = 0; // Nombre total de chiens créés
private static final int NB_REFUGES = 3; // Nombre de refuges
private static int[] occupationRefuge = new int[NB_REFUGES]; // Occupation des refuges (-1: libre, 0: occupé)
// Constructeur
public Chien(String tatouage, String nom) {
this.tatouage = tatouage;
this.nom = nom;
nbChiens++; // Incrémente le nombre de chiens à chaque création
}
// Méthodes statiques pour gérer les informations globales
public static int getNbChiens() {
return nbChiens;
}
// Méthodes pour gérer l'occupation des refuges
public static boolean placerDansRefuge(int numeroRefuge) {
if (numeroRefuge < 0 || numeroRefuge >= NB_REFUGES) {
System.err.println("Numéro de refuge invalide");
return false;
}
if (occupationRefuge[numeroRefuge] == -1) {
occupationRefuge[numeroRefuge] = 0;
return true;
} else {
System.err.println("Refuge déjà occupé");
return false;
}
}
public static boolean retirerDeRefuge(int numeroRefuge) {
if (numeroRefuge < 0 || numeroRefuge >= NB_REFUGES) {
System.err.println("Numéro de refuge invalide");
return false;
}
if (occupationRefuge[numeroRefuge] == 0) {
occupationRefuge[numeroRefuge] = -1;
return true;
} else {
System.err.println.println("Refuge déjà libre");
return false;
}
}
// Bloc statique pour initialiser le tableau des refuges
static {
for (int i = 0; i < NB_REFUGES; i++) {
occupationRefuge[i] = -1;
}
}
}
En Java, la protection d’un élément (méthode ou attribut) définit l’ensemble des entités qui peuvent y accéder. Cette protection s’applique au niveau de la classe et non de l’objet.
Modificateur | Dans la même classe | Dans le même package | Dans un sous-package | Depuis une autre classe |
---|---|---|---|---|
private | Oui | Non | Non | Non |
(aucun) | Oui | Oui | Non | Non |
protected | Oui | Oui | Oui | Non (sauf si sous-classe) |
public | Oui | Oui | Oui | Oui |
public class Personne {
/**
* Le nom de la personne.
* Cet attribut est privé pour garantir l'encapsulation des données.
*/
private String nom;
/**
* L'âge de la personne.
* Cet attribut est protégé pour permettre l'accès aux sous-classes.
*/
protected int age;
/**
* L'adresse de la personne.
* Cet attribut est public pour être accessible de n'importe où.
*/
public String adresse;
/**
* Le numéro de téléphone de la personne.
* Cet attribut est accessible uniquement depuis le même package.
*/
String telephone;
// ... méthodes ...
}
Un programme Java est un ensemble de classes. Chaque classe définit un nouveau type d’objet. Pour qu’un programme soit exécutable, il doit contenir au moins une classe avec une méthode main
.
La méthode main
: le point d’entrée
Signature: public static void main(String[] args)
public
: accessible de partoutstatic
: appartient à la classe, pas à une instancevoid
: ne retourne rienString[] args
: tableau de chaînes de caractères pour les arguments en ligne de commandeL’instanciation, c’est créer un objet (un instance) à partir d’une classe.
Le constructeur est une méthode spéciale qui :
Syntaxe d’instanciation:
/**
* Exemple d'instanciation des classes Voiture et Chien.
*
* @author Emmanuel Bruno
* @version 0.2
*/
public class Instanciation {
public static void main(String[] args) {
Voiture uneVoiture = new Voiture("1234 AB 83");
uneVoiture.setMarque("Rolls-Royce");
uneVoiture.demarrer();
System.out.println("uneVoiture est une " + uneVoiture.getMarque());
Chien c1 = new Chien("C1", "Rex");
Chien c2 = new Chien("C2", "Médor");
System.out.println("Il y a " + Chien.getNbChiens() + " chiens");
}
}
new
, la mémoire est allouée dans le heap.class RamasseMiette {
public static void main(String[] args) {
{ // Bloc pour limiter la portée de chien1
Chien chien1 = new Chien("X1", "Rex");
// chien1 sera collecté à la fin de ce bloc
}
// Création d'un grand tableau pour consommer de la mémoire
int[] grandTableau = new int[1000000]; // Simule une grosse consommation mémoire
// Boucle infinie (pour observer le comportement du GC)
while (true) {
// Rien à faire ici, juste attendre que le GC s'exécute
}
}
}
finalize()
java Runtime.getRuntime().gc();
new
length
)new
tableau[0]
null
(pour les références).length
: donne le nombre d’éléments du tableau.String
"
)+
equals()
et compareTo()
Integer.MAX_VALUE
.x + 5
, Math.sqrt(9)
, a == b
x = 5;
System.out.println("Hello");
int age = 30;
if
, for
, while
, etc.;
{}
switch
// Utilisation avec une énumération
public enum Jour { LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE }
Jour j = Jour.SAMEDI;
switch (j) {
case LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI:
System.out.println("Jour de semaine.");
break;
case SAMEDI, DIMANCHE:
System.out.println("Jour de fin de semaine.");
break;
default:
System.out.println("Un nouveau jour ?");
}
// Utilisation avec une chaîne de caractères
String j = "Samedi";
switch (j) {
case "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi":
System.out.println("Jour de semaine.");
break;
case "Samedi", "Dimanche":
System.out.println("Jour de fin de semaine.");
break;
default:
System.out.println("Un nouveau jour ?");
}
Chien[] mesChiens = {new Chien("C1", "Rex"), new Chien("C2", "Medor"), new Chien("C3", "Pluto")};
int chienCourant = 0;
while (chienCourant < mesChiens.length) {
System.out.println(mesChiens[chienCourant++]);
}
for (int i = 0; i < args.length; i++) {
System.out.print(i == args.length - 1 ? args[i] + "\n" : args[i] + ", ");
}
Chien[] mesChiens = {new Chien("C1", "Rex"), new Chien("C2", "Medor"), new Chien("C3", "Pluto")};
for (Chien c : mesChiens) {
System.out.print(c + " ");
}
for (Chien c : mesChiens)
permet d’itérer sur chaque élément du tableau et de l’assigner à la variable temporaire c
.package
suivi du nom du paquetage est placé en début de fichier.java package mon.paquet;
mon.paquet.MaClasse
import mon.paquet.MaClasse;
import mon.paquet.*;
(par défaut, java.lang.*
est importé)fr.univtln.bruno.java.animaux
: Contient les classes représentant les différents types d’animaux.fr.univtln.bruno.java.cages
: Contient les classes représentant les différents types de cages.Figure 3: Les packages en UML
fr.univtln.bruno.samples.Voiture
Chien
, Voiture
.Chien.NB_REFUGES
.nbChiens
, monChien
./**
et se terminent par */
.@author
, @param
, @return
)./**
* Représente un livre.
*
* @author VotreNom
*/
public class Livre {
/**
* Titre du livre.
*/
private String titre;
/**
* Constructeur de la classe Livre.
*
* @param titre Le titre du livre.
*/
public Livre(String titre) {
this.titre = titre;
}
/**
* Retourne le titre du livre.
*
* @return Le titre du livre.
*/
public String getTitre() {
return titre;
}
}
monProjet/
├── src/
│ ├── java/
│ │ ├── monPackage/
│ │ │ └── MaClasse.java
│ └── resources/
│ ├── config.properties
│ └── messages_fr.properties
├── bin/
├── lib/
│ ├── externalLib.jar
└── README.md
L’organisation avec Maven : une structure standardisée
Avantages:
monProjet/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/
│ │ └── resources/
│ └── test/
│ ├── java/
│ └── resources/
└── target/
E. Bruno