Champ static en java [Résolu]

Signaler
Messages postés
43
Date d'inscription
dimanche 26 août 2012
Statut
Membre
Dernière intervention
30 mai 2013
-
Messages postés
43
Date d'inscription
dimanche 26 août 2012
Statut
Membre
Dernière intervention
30 mai 2013
-
Bonjour à tous,

J'ai un code qui fait pas ce à quoi je m'attends, il s'agit d'un exercice qui comporte 3 classes (Entreprise, Contrat et sa sous-classe Cdd ou pour contrat à durée déterminée).


Le main de tout ça crée une entreprise en donnant sa taille (nombre de contrat) comme argument au constructeur public Entreprise(int taille){} qui initialise un tableau avec cette taille. C'est dans ce tableau qu'on mettra tout les contrats et on pourra les afficher grâce à une méthode de la classe Entreprise.afficheContrat().

Dans Entreprise j'ai ajoutContrat(Contrat c){dans laquelle je mets le nouveau contrat à l'indice suivant du tableau}.

Le problème est le suivant, je dois mettre un numéro de contrat qui s'incrémente à chaque nouvelle instanciation de l'objet Contrat. J'ai donc mis un champ protected static int numContrat=0; qui est incrémenté grâce au constructeur à chaque fois qu'on l'appelle.
public class Contrat{

protected static int numContrat=0;  
protected String nom;
protected String dateEmbauche;
protected float salaire;

public Contrat(String nom, String dateEmbauche, float salaire){

this.numContrat++;
this.nom=nom;
this.dateEmbauche=dateEmbauche;
this.salaire=salaire;

}

public String toString(){

String str = new String("Monsieur : "+this.nom+" Contrat n : "+numContrat+" engagé le "+dateEmbauche+" salaire mensuel brut de : "+salaire);
return str;

}
}

Le problème à l'exécution est qu'il affiche contrat N°4 pour tout les contrats (j'en fais 4 en tout) et non pas 1, 2, 3 ,4.

J'ai essayé pas mal de truc avec les this, super etc... rien n'y fait. A ce propos, qui sait ce que ça veut dire IncompatibleClassChangeError: static field expected ? En quoi est ce nécessaire de mettre un champ static ou pas pour la compilation (vu qu'il sait pas ce que je veux comme résultat?)

Un grand merci en tout cas à ceux qui prendront la peine de me lire,

Axel A+



Les petits ruisseaux font les grands fleuves...

2 réponses

Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
95
Salut,

Le comportement que tu obtiens reste conforme à l'utilisation que tu fais de ta variable static...

Tu pourrais faire ça:
public class Contrat{

private static int totalNumContrat=0;  /* sera utilisée pour l'incrément */
protected int numContrat;
protected String nom;
protected String dateEmbauche;
protected float salaire;

public Contrat(String nom, String dateEmbauche, float salaire){
totalNumContrat++;
this.numContrat = totalNumContrat;
this.nom=nom;
this.dateEmbauche=dateEmbauche;
this.salaire=salaire;

}

public String toString(){

String str = new String("Monsieur : "+this.nom+" Contrat n : "+numContrat+" engagé le "+dateEmbauche+" salaire mensuel brut de : "+salaire);
return str;

}
}



-----

"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
43
Date d'inscription
dimanche 26 août 2012
Statut
Membre
Dernière intervention
30 mai 2013

Salut, ça marche merci,

En fait la variable static reste à la dernière valeur qu'on lui a donnée, et ce peut importe l'objet instancié.
Si mnt je l'initialise à 2, elle va rester sur deux pour tt les objets.
Dans le cas d'incrémentation elle va se "réinitialiser" incrémentée de 1 à chaque nouvel objet et lors de l'affichage elle aura la dernière valeur qu'elle aura eu pour tout les objets.
C'est en gros une variable globale ou du moins elle correspond à ce qui serait une variable déclarée dans le main.

C'est sympas d'avoir répondu, ça fait un soucis en moins pour l'exam.

A +

Les petits ruisseaux font les grands fleuves...