Vous êtes sur la page 1sur 21

Java : classes interne et locale

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

Avril 2018, H & H: Research and Training 1 / 15


Plan

1 Classe interne

2 Classe locale

Avril 2018, H & H: Research and Training 2 / 15


Classe interne

Java

I c
Classe interne ?
ELH
O U
Une classe définie à l’intérieur d’une autre
L M
f E et méthodes de la classe
Pouvant accéder aux attributs
r e
englobante
A ch
c

Avril 2018, H & H: Research and Training 3 / 15


Classe interne

Java
Considérant la classe Personne suivante
package org.eclipse.model;

public class Personne {


I c

private String nom;
ELH
private String prenom; U
private int age;
L MO
f E
re nom, String prenom, int age) {
h
public Personne(String
c
c A = prenom;
this.nom =

this.prenom
nom;

this.age = age;
}

// + getters et setters
}

Avril 2018, H & H: Research and Training 4 / 15


Classe interne

Java
Hypothèse

Si on décide d’ajouter les deux propriétés suivantes dans la classe


Personne

I c

majoriteSexuelle : acceptant les valeurs majeur et mineur
H
EL adolescent, et
periode : acceptant les valeurs bébé,U
MO
enfant,
adulte
fE L
c h r e
c
A

Avril 2018, H & H: Research and Training 5 / 15


Classe interne

Java
Hypothèse

Si on décide d’ajouter les deux propriétés suivantes dans la classe


Personne

I c

majoriteSexuelle : acceptant les valeurs majeur et mineur
H
EL adolescent, et
periode : acceptant les valeurs bébé,U
MO
enfant,
adulte
fE L
Remarques c h r e
c A
Les deux propriétés dépendent de l’attribut age
On peut donc les regrouper ensemble dans une nouvelle classe
Cette nouvelle classe doit être placée dans Personne pour
qu’elle ait accès à l’attribut age

Avril 2018, H & H: Research and Training 5 / 15


Classe interne

Exemple de code pour la classe Categorie qu’on va définir dans Personne

public class Categorie {


private String majoriteSexuelle;
private String periode;
public Categorie() {
if (age >= 18) {
majoriteSexuelle = "majeur";
periode = "adulte";
I c

} else {
majoriteSexuelle = "mineur";
ELH
if (age < 2)
U
periode = "bébé";
L MO
else if(age < 12)
f E
hre
periode = "enfant";
else
c
c A
periode = "adolescent";

}
}

@Override
public String toString() {
return "Categorie [majoriteSexuelle = " + majoriteSexuelle + ",
periode = " + periode + "]";
}
}

Avril 2018, H & H: Research and Training 6 / 15


Classe interne

Modifions la classe Personne pour intégrer la classe Categorie


public class Personne {

private String nom;


private String prenom;
private int age;
private Categorie categorie;

public Personne(String nom, String prenom, int age) {


I c

this.nom = nom;
ELH
this.prenom = prenom;
U
this.age = age;
categorie = new Categorie();
L MO
f E
hre
}

c
c A
// + getters et setters

@Override
public String toString() {
return "Personne [nom = " + nom + ", prenom = " + prenom + ", age =
" + age + ", categorie = " + categorie + "]";
}

// + code de la classe Categorie


}
Avril 2018, H & H: Research and Training 7 / 15
Classe interne

Java
Pour tester
package org.eclipse.test;

public class Main {


public static void main(String [] args) {
I c

Personne personne = new Personne("el mouelhi","achref
ELH
", 34);
U
System.out.println(personne);
L MO
}
f E
}
c hre
c A

Avril 2018, H & H: Research and Training 8 / 15


Classe interne

Java
Pour tester
package org.eclipse.test;

public class Main {


public static void main(String [] args) {
I c

Personne personne = new Personne("el mouelhi","achref
ELH
", 34);
U
System.out.println(personne);
L MO
}
f E
}
c hre
c A

Le résultat sera
Personne [nom = el mouelhi, prenom = achref, age=34,
categorie = Categorie [majoriteSexuelle = majeur,
periode = adulte]]

Avril 2018, H & H: Research and Training 8 / 15


Classe interne

Java
Remarques

À la compilation deux fichiers, relatifs à la classe Personne, ont été


générés (d’extension .class)

I c

Le premier : Personne
LH
Le deuxième : Personne$CategorieUE
L MO
h r e fE
A c
c

Avril 2018, H & H: Research and Training 9 / 15


Classe interne

Java
Remarques

À la compilation deux fichiers, relatifs à la classe Personne, ont été


générés (d’extension .class)

I c

Le premier : Personne
LH
Le deuxième : Personne$CategorieUE
L MO
h r e fE
Attention
A c
c
l’age, les valeurs de periode et majoriteSexuelle
En changeant
ne seront pas mises à jour.

Avril 2018, H & H: Research and Training 9 / 15


Classe interne

Java
Remarques

À la compilation deux fichiers, relatifs à la classe Personne, ont été


générés (d’extension .class)

I c

Le premier : Personne
LH
Le deuxième : Personne$CategorieUE
L MO
h r e fE
Attention
A c
c
l’age, les valeurs de periode et majoriteSexuelle
En changeant
ne seront pas mises à jour.

Solution
Utiliser les classes locales.
Avril 2018, H & H: Research and Training 9 / 15
Classe locale

Java

Classe locale ?
I c

EL H
Une classe définie dans une méthode d’une autre
Pouvant accéder aux attributs etM
U
O de la classe
méthodes
englobante
fE L
h r e
caccéder aux paramètres de la méthode où elle est
c
définie
A
Pouvant aussi

Avril 2018, H & H: Research and Training 10 / 15


Classe locale

Java
Considérant la classe Personne suivante
package org.eclipse.model;

public class Personne {


I c

private String nom;
ELH
private String prenom; U
private int age;
L MO
f E
re nom, String prenom, int age) {
h
public Personne(String
c
c A = prenom;
this.nom =

this.prenom
nom;

this.age = age;
}

// + getters et setters
}

Avril 2018, H & H: Research and Training 11 / 15


Classe locale

Java
Hypothèse
Nous allons garder les attributs de la classe Categorie
majoriteSexuelle : acceptant les mêmes valeurs majeur et
mineur I c

H
EL bébé, enfant,
periode : acceptant aussi les mêmesU
MO
valeurs
adolescent, et adulte
fE L
c h r e
c
A

Avril 2018, H & H: Research and Training 12 / 15


Classe locale

Java
Hypothèse
Nous allons garder les attributs de la classe Categorie
majoriteSexuelle : acceptant les mêmes valeurs majeur et
mineur I c

H
EL bébé, enfant,
periode : acceptant aussi les mêmesU
MO
valeurs
adolescent, et adulte
fE L
c h r e
c A
Remarques

La classe Categorie sera plutôt définie dans une méthode


(afficherDetails()) de la classe Personne
Elle sera aussi instanciée dans cette même méthode

Avril 2018, H & H: Research and Training 12 / 15


Classe locale

Java
La méthode afficherDetails() qu’on va ajouter dans Personne

public void afficherDetails() {


class Categorie {

private String majoriteSexuelle;


private String periode;

public Categorie() {
if (age >= 18) {
I c

majoriteSexuelle = "majeur";
periode = "adulte";
ELH
} else {
U
MO
majoriteSexuelle = "mineur";

L
if (age < 2)
periode = "bébé";

f E
hre
else if(age < 12)
periode = "enfant";
else
c
c A
periode = "adolescent";

}
}

@Override
public String toString() {
return "majoriteSexuelle=" + majoriteSexuelle + ", periode=" + periode;
}
}

Categorie categorie = new Categorie();


System.out.println("nom= " + nom + ", prenom = " + prenom + ", " + categorie);
}

Avril 2018, H & H: Research and Training 13 / 15


Classe locale

Java
Pour tester
package org.eclipse.test;

public class Main {


public static void main(String [] args) {
Personne personne = new Personne("el mouelhi","achref",34);
I c

personne.afficherDetails();
ELH
U
MO
personne.setAge(10);
personne.afficherDetails();
}
f E L
}
c hre
c A

Avril 2018, H & H: Research and Training 14 / 15


Classe locale

Java
Pour tester
package org.eclipse.test;

public class Main {


public static void main(String [] args) {
Personne personne = new Personne("el mouelhi","achref",34);
I c

personne.afficherDetails();
ELH
U
MO
personne.setAge(10);
personne.afficherDetails();
}
f E L
}
c hre
c A
Le résultat sera
nom = el mouelhi, prenom = achref, majoriteSexuelle = majeur,
periode = adulte
nom = el mouelhi, prenom = achref, majoriteSexuelle = mineur,
periode = enfant

Avril 2018, H & H: Research and Training 14 / 15


Classe locale

Java

Remarques

I c

H
À la compilation deux fichiers, relatifs à la classe Personne, ont été
EL
générés (d’extension .class) U
L MO
Le premier : Personne
re f E
Le deuxième : c
A h
Personne$1Categorie ⇒ 1 étant l’indice de la
classe c (les classes locales seront numérotées dans l’ordre
locale
et la première aura l’indice 1)

Avril 2018, H & H: Research and Training 15 / 15

Vous aimerez peut-être aussi