IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

[Débutant] Class - Je ne comprends plus rien !


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut [Débutant] Class - Je ne comprends plus rien !
    Bonjour,

    Je cherche désespérément à comprendre les getter et setter d'une classe. Jusque là, j'ai compris que dans le premier cas on récupère les informations alors que dans l'autre on écrit les informations.

    Me basant sur ce constat, j'ai essayer de me faire un exemple afin de tester la validité de mes dires. Et la miracle, c'est deux erreurs que je ne comprends pas!

    Tout d'abord voici ma classe de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    package AppliClasses;
     
    public class Chanson {
     
        /*
         * Les méthodes de la classe chanson
         */
        public void setChanson(String titleChanson) {
            this.nomChanson = titleChanson;
        }
     
        public void getChanson() {
            //System.out.println(nomChanson);
     
            return nomChanson;
        }
     
        /*
         * Les champs de la classe chansson
         */
        private String nomChanson;
    }
    Lorsque je place mon return nomChanson, je cherche à retourné le nom via le getter, vue qu'il est censé le renvoyer. A moins que je ne me trompe !
    L'erreur que me retourne netBeans est la suivante .
    cannot return a value from methode whose result type is void
    En gros, si j'ai bien compris, on ne peux pas retourné de valeur car la méthode est de type void.

    Pourquoi ? Et comment alors je devrais faire mon getter pour qu'il me retourne la valeur?

    Ensuite, passons du cotés du main. ou j'ai un autre type d'erreur et je ne sait pas si c'est le complément de la première. Je suppose que oui.

    Si j'écris le main suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    package Appli;
    import AppliClasses.Chanson;
     
    public class MainForm extends javax.swing.JFrame {
     
        /** Creates new form MainForm */
        public MainForm() {
            initComponents();
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextAreaOut = new javax.swing.JTextArea();
            jBtnTester = new javax.swing.JButton();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     
            jTextAreaOut.setColumns(20);
            jTextAreaOut.setRows(5);
            jScrollPane1.setViewportView(jTextAreaOut);
     
            jBtnTester.setText("Tester");
            jBtnTester.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jBtnTesterActionPerformed(evt);
                }
            });
     
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                        .addComponent(jBtnTester))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jBtnTester)
                    .addContainerGap())
            );
     
            pack();
        }// </editor-fold>
     
        private void jBtnTesterActionPerformed(java.awt.event.ActionEvent evt) {
     
            Chanson ch = new Chanson();
            ch.setChanson("Butterfly");
     
            //ch.getChanson();
            jTextAreaOut.setText(ch.getChanson());
        }
     
     
        /**
        * @param args the command line arguments
        */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new MainForm().setVisible(true);
                }
            });
        }
     
        // Variables declaration - do not modify
        private javax.swing.JButton jBtnTester;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextAreaOut;
        // End of variables declaration
     
    }
    J'obtiens le message d'erreur suivant:
    'void' type not allowed here.
    Donc en gros je n'ai pas alloué de type void à mon affichage.

    Je précise que ce n'est pour moi qu'un exercice visant à comprendre comment fonctionne une classe. Il se peut que j'ai commis d'énormes erreurs, mais ce n'est pas simple avec le nombre de messages ne disant pas la même chose.

    Je sollicite donc votre aide pour éclairer ma lanterne et y voire plus clair en ce qui concerne les classes.

    Merci beaucoup pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Par défaut
    Là ta méthode get retourne void (vide ou rien). Pour retourner un type donné, il faut le déclarer dans la signature de ta méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public String getChanson() {
            //System.out.println(nomChanson);
     
            return nomChanson;
        }

  3. #3
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Ok pour l'histoire du void.

    Mais cela ne me dit en rien pourquoi la fonction ne prendrais pas directement le champ nomChanson dans le getter alors que nomChanson est cencé se remplir avec le setter. A moins que je ne me trompe. Ce qui se peut aussi.

  4. #4
    Membre chevronné
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Par défaut
    Bonjour.

    Citation Envoyé par Microbulle Voir le message
    Mais cela ne me dit en rien pourquoi la fonction ne prendrais pas directement le champ nomChanson dans le getter alors que nomChanson est cencé se remplir avec le setter. A moins que je ne me trompe. Ce qui se peut aussi.
    De quelle fonction parlez vous ?

    L'intérêt de la classe est de créer un type.
    Ce type va contenir des attributs (ici, il n'y a qu'un seul attribut : nomChanson). En règle général, ces attributs sont "privés", ce qui signifie que seule des méthodes de la classe vont pouvoir y accéder.
    Si l'on veut que d'autres classes y accèdent, il faut créer ce que l'on appelle des getters et setters pour chaque attribut.
    Les getters/setters sont des méthodes de la classe retournant (get) ou affectant (set) un attribut privé. L'intérêt est que l'attribut ne peut pas être directement modifié dans une autre classe (cela évite les choses du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Chanson ch = new Chanson();
    ch.nomChanson = "blabla";
    On est ainsi obligé de passer par les méthodes des classes pour y accéder en lecture comme en écriture.

    Ainsi, lorsque vous faîtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chanson ch = new Chanson();
    Vous créez un nouvel objet de la classe Chanson.
    Cet objet possède alors l'état suivant :
    ch
    nomChanson == null
    Ensuite, vous affectez le nomChanson en utilisant le setter (donc vous modifiez votre objet ch de classe Chanson) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch.setChanson("Butterfly");
    Votre objet possède alors l'état suivant :
    ch
    nomChanson == "Butterfly"

    Enfin, vous accédez à l'attribut nomChanson via son getter (vous ne modifiez pas l'objet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jTextAreaOut.setText(ch.getChanson());

  5. #5
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Je suis bien d'accord avec ce qui est dit plus haut.
    Mais si on se doit d'éviter ce que j'ai écrit, comme dit au précédent post. Il faut faire comment pour que ça fonctionne ?

    Je vais faire un édit.
    Je me suis baladé sur les tutoriaux, quand d'un coup je me suis rendu compte que des getters était écris comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public String getName() {
        return cached;
    }
    Si je regarde bien mon code, j'avais mis void à la place de String. C'est pour ça que dans mon main, j'avais une erreur du à void.

    Je n'avais pas saisie que l'on pouvais forcé un getter à un type comme String. Du coup, j'ai écrit ma classe ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    package AppliClasses;
     
    public class Chanson {
     
        /*
         * Les méthodes de la classe chanson
         */
        public void setChanson(String titleChanson) {
            this.nomChanson = titleChanson;
        }
     
        public String getChanson() {
            //System.out.println(nomChanson);
     
            return nomChanson;
        }
     
        /*
         * Les champs de la classe chansson
         */
        private String nomChanson;
    }
    Maintenant j'aimerais en savoir un peux plus en ce qui concerne les possibilités d'étendre la classe depuis une autre classe. C'est à dire déjà savoir si c'est possible et y ajouter un attribue durée par exemple.

  6. #6
    Membre chevronné
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Par défaut
    En fait, le getter retourne un attribut.
    L'attribut nomChanson est du type String, donc le getter de nomChanson ne peut que retourner un type String.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Maintenant j'aimerais en savoir un peux plus en ce qui concerne les possibilités d'étendre la classe depuis une autre classe. C'est à dire déjà savoir si c'est possible et y ajouter un attribue durée par exemple.
    Ce dont vous parlez doit s'agir d'héritage ?
    C'est à dire créer une nouvelle classe identique à la classe Chanson, cependant cette classe aurait en plus un attribut duree, est-ce bien cela ?

    Si c'est ce que vous souhaitez, je vous conseille de lire le didacticiel conseillé dans un sujet plus haut du forum :
    http://java.developpez.com/livres/javaEnfants/ et en particulier le paragraphe suivant : http://java.developpez.com/livres/ja...e=classes#LV-D

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Action sur un bouton..Je comprends plus rien du tout!
    Par koolway dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 26/04/2006, 10h17
  2. Réponses: 4
    Dernier message: 20/04/2006, 14h25
  3. Réponses: 12
    Dernier message: 03/01/2006, 17h23
  4. Je n'y comprend plus rien
    Par Pingouinvert dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 11/09/2005, 10h57
  5. [Kylix] Je n'y comprends plus rien
    Par fafamonteko dans le forum EDI
    Réponses: 5
    Dernier message: 02/03/2004, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo