Champ static en java [Résolu]

axelvdk 43 Messages postés dimanche 26 août 2012Date d'inscription 30 mai 2013 Dernière intervention - 19 mai 2012 à 16:32 - Dernière réponse : axelvdk 43 Messages postés dimanche 26 août 2012Date d'inscription 30 mai 2013 Dernière intervention
- 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...
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention - 19 mai 2012 à 19:36
3
Merci
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

Merci Twinuts 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de Twinuts
axelvdk 43 Messages postés dimanche 26 août 2012Date d'inscription 30 mai 2013 Dernière intervention - 20 mai 2012 à 12:38
0
Merci
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...
Commenter la réponse de axelvdk

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.