Partage
  • Partager sur Facebook
  • Partager sur Twitter

[POO] Problème méthode

    15 octobre 2011 à 12:03:56

    Bonjour,

    Je voulais tester la POO en java avec un exemple similaire à celui du C++ : le rpg
    J'ai rajouté une méthode "recevoirDegats".
    Normalement, elle doit écrire : "personnage n'a plus que 50 pv" par example.
    Mais on dirait qu'elle ne connait plus les valeurs de vie et du nom du personnage :
    "null n'a plus que -50 pv"

    Voici le code de l'objet :

    public class Personnage {
    	private String nom;
    	private int vie;
    	private int force;
    	private int defense;
    	
    	public Personnage(String nom, int vie, int force, int defense){
    		System.out.println("Creation d'un personnage...");
    		nom = nom;
    		vie = vie;
    		force = force;
    		defense = defense;
    		System.out.println(nom + " a ete cree !");
    		System.out.println(nom + " a " + force + " points de force et " + defense + " de defense.");
    		System.out.println(nom + " a " + vie + " PV.");
    	}
    	
    	public void RecevoirDegats(int nbDegats)
    	{
    		vie = vie - nbDegats;
    		System.out.println(nom + " n'a plus que " + vie + " PV !");
    	}
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      15 octobre 2011 à 12:24:46

      Bonjour,

      Déjà, je pense qu'en corrigeant une petite chose dans tes méthodes, tu verras un gain de "rendement" :p : utilise le mot-clé this:

      //La, utilise le mot-clé this:
              public Personnage(String nom, int vie, int force, int defense){
      		System.out.println("Creation d'un personnage...");
      		this.nom = nom;
      		this.vie = vie;
      		this.force = force;
      		this.defense = defense;
      		System.out.println(nom + " a ete cree !");
      		System.out.println(nom + " a " + this.force + " points de force et " + this.defense + " de defense.");
      		System.out.println(nom + " a " + this.vie + " PV.");
      	}
      	
      	public void RecevoirDegats(int nbDegats)
      	{
      		this.vie = vie - nbDegats;
      		System.out.println(nom + " n'a plus que " + this.vie + " PV !");
      	}
      


      Bon alors ici, j'ai BEAUCOUP utilisé ce mot clé, mais c'est pour te montrer comment tu pourrais t'en servir ^^ .
      • Partager sur Facebook
      • Partager sur Twitter
        15 octobre 2011 à 12:31:09

        Ah oui, ça marche...
        J'avais essayé pourtant...

        Merci !
        • Partager sur Facebook
        • Partager sur Twitter
          15 octobre 2011 à 12:47:35

          C'est quoi ce délire de rendement avec "this" ? Ici, Amidézanimo man, tu l'as utilisé n'importe comment, alors que le problème de Xaychru04 était évident pour quelqu'un qui a un peu l'habitude de Java.

          Le problème vient de ceci (extrait) :
          private String nom;
          	private int vie;
          	private int force;
          	private int defense;
          	
          	public Personnage(String nom, int vie, int force, int defense){
          		nom = nom;
          		vie = vie;
          		force = force;
          		defense = defense;
          


          En Java, on peut parfaitement utiliser le même nom pour un champ de la classe et pour une variable dans une méthode.
          Dans ce cas, le nom utilisé seul est celui qui a la portée la plus faible, donc celui de la méthode.

          Conséquence :
          Xaychru04 a écrit, dans la méthode "nom = nom" (etc.)
          Le compilateur n'a aucun moyen de deviner que le premier "nom" fait référence à celui du champ et le second à celui de la méthode.
          Il faut donc lui expliquer : ça se fait avec le mot-clé "this" qui désigne l'objet dans lequel on est.
          Le même exemple qui fonctionne est :

          private String nom;
          	private int vie;
          	private int force;
          	private int defense;
          	
          	public Personnage(String nom, int vie, int force, int defense){
          		this.nom = nom;
          		this.vie = vie;
          		this.force = force;
          		this.defense = defense;
          

          On remarque au passage que la coloration syntaxique aide : les noms de champ sont en jaune, ceux des variables internes à la méthode en noir.

          Si tu utilise un IDE (Eclipse par exemple), tu verras un bel avertissement sur toutes les lignes problématiques du code d'origine, qui t'expliquera que l'affectation n'a aucun effet.
          Elle compile, mais tu mets la valeur de A dans A, autrement dit tu ne fais rien.

          Dans cet exemple, aucune autre occurrence de "this" n'est nécessaire.

          Elles peuvent parfois augmenter la lisibilité (et parfois la réduire), mais pas spécialement améliorer le "rendement".

          D'autre part, dans le forum Java, pas la peine de préciser "POO" dans le sujet : même si c'est techniquement possible de ne pas utiliser la POO en Java, absolument personne ne fait ça, sauf peut-être de touts petits exercices de grands débutants.
          • Partager sur Facebook
          • Partager sur Twitter
            15 octobre 2011 à 12:57:04

            Oui excuse moi, j'ai mal choisis mes mots o_O je ne savais pas trop comment m'exprimer sur ce terme... Désolé ! Sinon, très bonne explication
            • Partager sur Facebook
            • Partager sur Twitter
              15 octobre 2011 à 13:14:17

              Oui, merci beaucoup !

              Edit :

              Donc pour la suite qui indique la création d'un personnage, je dois mettre


              System.out.println(this.nom + " a ete cree !");
              
              • Partager sur Facebook
              • Partager sur Twitter
                15 octobre 2011 à 13:52:15

                Oui voilà ! Puisque en utilisant this.nom, tu fais référence au champ nom (merci à SpaceFox ;) ) avec :
                this.nom = nom;
                


                De ce fait, si tu écrit :
                System.out.println(this.nom + " a ete cree !");
                


                C'est la valeur du champ nom qui apparaîtra.
                • Partager sur Facebook
                • Partager sur Twitter
                  15 octobre 2011 à 13:55:08

                  En fait on s'en fiche : 4 lignes avant tu as dit que "nom" et "this.nom" c'était la même chose.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [POO] Problème méthode

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown