Champ static en java

Résolu
axelvdk Messages postés 41 Date d'inscription dimanche 26 août 2012 Statut Membre Dernière intervention 30 mai 2013 - 19 mai 2012 à 16:32
axelvdk Messages postés 41 Date d'inscription dimanche 26 août 2012 Statut Membre Dernière intervention 30 mai 2013 - 20 mai 2012 à 12:38
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

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
19 mai 2012 à 19:36
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
3
axelvdk Messages postés 41 Date d'inscription dimanche 26 août 2012 Statut Membre Dernière intervention 30 mai 2013 1
20 mai 2012 à 12:38
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...
0
Rejoignez-nous