Jeux Libres
       
           

» Les Tutoriels » La programmation de jeux avec le langage Java » Comment utiliser les fonctions en Java

Comment utiliser les fonctions en Java


Changement au programme : j'ai décidé de faire passer le chapitre sur les listes dans la partie II, c'est mieux je crois car il est plus facile de comprendre cette partie en connaissant bien les notions de l'orienté objet, en même temps je pourrai vous apprendre plus simplement à faire des petits programme utilisant plusieurs classes mais avant cela, attaquons le dernier chapitre de cette partie ou nous allons apprendre à créer des fonctions.





Chapitre précédent     Sommaire     Chapitre suivant


Les méthode liées à une classe (méthodes statiques)


Partie I (suite et fin)



Définition de méthodes



Ce sont de bêtes fonctions comme en C. On peut leur envoyer des paramètres (ou arguments) et leur définir une valeur de retour. (Pas obligatoire.)
On ne peut par contre pas définir plusieurs valeurs de retour pour une fonction comme en python. (Pour ceux qui connaissent.)

Partie sur les variables (ou objet) static ci dessous.

Et plus bas quand je vous parlerai des variables de classe ou statiques, vous verrez que seules ces variables là pourront être modifiées dans une méthode statique.


Mais en définitive, c'est quoi une méthode statique ?


C'est une méthode qui a le même comportement pour tout les objets d'une classe, par exemple, le main est une méthode statique : l'exécution du programme à partir du main (en effet) est commune pour tous les objets de votre programme!
C'est logique, on ne va créer à chaque fois un programme exécutable différent pour chaque objet, imaginez, se serait lourd et ça prendrait plus de place!!

Donc pour créer des méthodes hors du main, pour l'instant, je vous demanderai à tous d'écrire le mot clé static devant le nom de votre méthode!

Des exemples pour mieux comprendre



Exemple : toutes les méthodes de la classe Math sont statiques, en effet, le but de la classe Math n'est pas de créer des objets de type math, mais d'effectuer des calculs pour ensuite renvoyer par exemple la racine carrée d'un nombre.

Comment appelé une méthodes de classe :


Il suffit décrire tout bêtement le nom de sa classe suivit de cette méthode, les deux étant séparé par un point.

C'est le cas de la fonction Math.random() que je vous ai fait utiliser dans les exercices précédents.

Syntaxe d'une méthode statique :
1
public static void maMethode (int arg1, int arg2) {...}

Et pour appeler la méthode, il suffira d'écrire dans le main :
1
maMethode (arg1, arg2);

Quelques remarques.




Pas nécessaire d'écrire le nom de la classe pour appeler votre méthode statique si celle-ci est définie dans la classe que vous êtes entrain de coder.



Par contre si vous devez appeler une méthode statique définie dans une autre classe, là vous devrez mettre le nom de sa classe suivit d'un point pour séparer le nom de la classe et celui de sa méthode.


Remarque, c'est encore plus simple que le C/C++ car il est pas nécessaire de définir le prototype de vos méthodes au début de vos fichiers ou dans un fichier ".h"!!!
En mémoire, on aura donc la méthode qui sera stockée dans la mémoire de la classe, et non dans la mémoire des objets.
Ce qui nous donnera comme shéma :

Ou MS1 est une méthode statique stockée dans l'espace mémoire de la classe et non dans l'espace mémoire des objets comme l'est M1!

Les pointeurs en Java



Attention, pas de pointeurs en Java!!
Si vous voulez modifier la valeur de variables simples, (pas des tableaux ni des objets) dans une méthode hors du main, bah votre programme ne le fera pas, car il va copier la valeur des variables du main dans les arguments de la fonction, c'est donc une copie de valeur, et pas de l'adresse de vos variables que java va faire, du coup bah la fonction va modifier les valeurs d'une copie de vos variables qui se trouvent à une autre adresse en mémoire. Et donc le programme ne va pas modifier la valeur se trouvant à l'adresse de vos variables dans le main mais des copies et à la fin de la fonction, les copies seront supprimées et donc en fait votre programme va tout simplement ne rien faire du tout! (Ceci n'est valable que pour les types primitifs de java, pas pour les objets!)


Exemple :
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
     public static void main (String[] args) {
         int var1 = 1, var2 = 5;
         System.out.println("Avant l'appel de la méthode : "+var1+" "+var2);
         modifier (var1, var5);
         System.out.println("Après l'appel de la méthode : "+var1+" "+var2);
//Nah j'ai corrigé pour le guillemet en trop. Merci pour le signalement.
     }
     public static void modifier (int var1, int var2) {
         var1 += 4;
         var2 += 7;
     }  
}
Qu'est ce qui se passe ?


Bah rien.

Et pas question de faire des pointeurs car cela n'existe pas en Java.
Donc pas question de faire ceci : (pour ceux qui ont fait du c/c++, cela ne marche pas en Java!)

A ne pas faire!
[code=java]
public class Test {
     public static void main (String[] args) {
         int var1 = 1, var2 = 5;
         System.out.println("Avant l'appel de la méthode : "+var1+" "+var2);
         modifier (&var1, &var5);
         System.out.println("Après l'appel de la méthode : "+var1+" "+var2);
//Nah j'ai corrigé pour le guillemet en trop. Merci pour le signalement.
     }
     public static void modifier (int *var1, int *var2) {
         *var1 += 4;
         *var2 += 7;
     }  
}
[/code]

Le mot clé static n'est pas utilisable lors d'une déclaration de classe, une classe est déjà statique car si vous vous rappelez de sa définition, elle permet de décrire un type d'objet précis et cette description est commune pour tout les objets créés à partir de la même classe!


Remarque : il y a un raccourcis possible si on veut récupérer pas exemple le première élément d'une méthode qui renvoie un tableau.


Au lieu d'écrire tout ça
1
2
String[] sTab = getString ();
String sChaine = sTab[0];

On peut écrire ceci directement :
1
String sChaine = getString()[0];

Quelques remarques.



Dans une méthode statique vu que c'est la classe qui appelle la méthode et non un objet de cette classe, on ne pourra pas faire référence à un objet sur lequel la méthode est appelée car celui-ci n'existe pas..., le mot clé this que l'on verra plus loin ne sera pas utilisable dans les méthodes statique, si vous essayer de l'utiliser votre programme ne compilera pas!
On peut par contre appelé une méthode statique à partir d'un objet d'une classe, ça compile quand même mais ce n'est pas très logique, donc, je ne vous conseille pas de le faire, j'appellerai toujours mes méthode statique par le nom de leur classe.


Les liée à un type d'objet précis (méthode d'instances)


Différences par rapport aux méthodes statiques.



A la différence des méthodes statiques, celles-ci nécessitent d'être appelées sur le nom d'un objet et non sur le nom d'une classe.

C'est le cas des méthodes contenue dans la classe String.
Lorsque vous écrivez par exemple :
chaine1.charAt (0);

Vous êtes obligé de crée une variable de type chaine de caractère (de type String donc)avant de pouvoir appeler la méthode charAt. Bah là vous faîtes non plus appel à une méthode statique mais à une méthode d'instance car vous devez créer un objet de type String avant de pouvoir appeler cette méthode, hors les méthodes statiques ne le nécessitent pas.
Syntaxe d'une méthode d'instance :
1
public void modifieCoordonnees (int nvX, int nvY) {...}
Appel de la méthode dans le main :
1
2
Point p = new Point (); 
p.modifieCoordonnees (4, 6);

Là par contre, même s'il n'y a pas de pointeurs, les valeurs de p seront quand même modifiées car elles sont contenues dans la case mémoire de l'objet de type Point, et donc, comme la méthode est aussi dans la classe de l'objet p, elle va donc modifier les variables contenues dans la mémoire de l'objet p et non plus créé des copies de variables comme je vous l'ai montrer dans le tutoriel précédant.


Un schéma pour bien comprendre tout cela.

Reprenons notre méthode statique du tutoriel précédent.

Classe du main :



La méthode est obligé de copier la valeur des variables de votre main dans des variables crées ailleurs en mémoire. Et il est impossible d'envoyer l'adresse de var1 et var2 dans des pointeurs car cela n'existe pas en Java!!

Maintenant reprenons notre méthode modifieCoordonnees et
supposons que l'on a créé un objet Point qui a pour coordonnée 5 et 7.
On aura donc dans la mémoire de l'objet point ceci :



Lors de l'appel de la méthode, elle sait qu'elle doit modifier les valeurs contenues dans la mémoire de p1 vu que elle sera appelée sur l'objet p1.
Donc la valeur des variables de l'objet seront bien modifiées.
Si on écrit le corps de la méthode, en effet on voit que l'ont doit modifier le contenu des variables sur l'objet créé en mémoire dans la classe Point, c'est à dire p1.

Le référence l'objet sur lequel on a appeler la méthode. (this référence p1 ici!)
Il est facultatif ici car x et nvX ont des noms différents, on verra l'utilisation de ce mot clé plus loin, retenez juste ici qu'il fait bien référence à p1, et modifie donc bien les variables de l'objet p1.
1
2
3
4
public void modifieCoordonnees (int nvX, int nvY) {
      this.x = nvX;
      this.y = nvY;
}

[titre1]Les méthodes sans retour et celles avec retour.[titre1]

Je vous l'ai peut être déjà dit, et je le répète.
Chaque nom de méthode doit être précédé du type (de retour) qu'elle renvoie.

Si elle ne renvoie rien, void précède le nom de la méthode.

Exemple d'une méthode avec retour :
1
2
3
4
public static int changeTailleDesObjets (int nvTaille) {
      taille = nvTaille;
      return taille; //return obligatoire!!
}

Exemple d'une méthode sans retour :
1
2
3
4
public void changeCoordonnes (int nvX, int nvY) {
      p1.x = nvX;
      p1.y = nvY; //return pas obligatoire, puisque la méthode ne renvoie rien.
}

Les méthodes renvoyant des tableaux.

Les tableaux sont des objets, leurs valeurs seront donc bien modifiées dans le main à l'appel de votre fonction.

On peut demander aisément à une méthode de renvoyer un tableau.
Exemple :
1
2
3
4
5
6
public int[] modifierTableau (int[] tableau) {
      for (int i = 0; i <= tableau.length; i++) {
           tableau[i] = i;
      }
      return tableau;
}

Appel de la méthode dans le main :
1
iTab = modifierTableau (iTab);
Une méthode peut aussi bien sûr renvoyer un objet ou un tableau d'objets.

Voila maintenant je crois que je vous ai tout dit sur les méthodes en Java, nous pouvons passez à autre chose =)


Les variables de classe et les variables des objets


Les variables d'objets ou d'instances ou encore variables membres :



Ce sont des variables dont les valeurs sont différentes pour chaque objet que l'ont crée grâce à sa classe.

Par exemple, si l'on veut créer des objets de type voiture, et que l'on veut pouvoir  créer des voitures de marques différentes, on définira tout simplement une variable de type String dans la classe Voiture comme ceci :
String marque;

Cette variable marque pourra prendre des valeurs différentes en fonction de l'objet voiture que l'on veut créer en mémoire.

Mais supposons maintenant que l'on vieille créer que des voiture de la marque Peugeot.

Bah au lieu de réécrire à chaque fois quand l'on va créer un objet de type voiture, la valeur de marque, on va crée une variable statique ou de classe qui aura la même valeur pour tout les objets de cette classe Voiture.
Déclaration d'une variable statique :
1
static String marque = "Peugeot";

Et voilà, plus besoin de faire autre chose.

Exemples



Un exemple pour bien comprendre, une classe qui crée des objets voiture de même marque mais de couleur différente.
1
2
3
4
public class Voiture () {
    private static String marque = "Peugeot";
    private int couleur;    
}

Limite des variables statiques.



Les variables statiques ne pourront être modifiées que dans des méthodes statiques.

On ne peut pas créér d'objet (=instancier) dans des méthodes statiques.

Dans des méthodes statiques, on ne pourra faire usage uniquement que de méthodes et variables statiques.
Par contre, l'inverse est possible : on peut faire appel à des méthodes statiques, et modifier le contenu de variables statiques, dans des méthodes d'instances.


Exercices


1)
Je veux maintenant que vous repreniez l'exercice 3 du tuto sur les tableaux.
Là, dans ma solution, j'ai tout mis dans le main, je veux que vous me fassiez une méthode qui génère un tableau de nombre aléatoirement et une autre qui affiche le contenu entier d'un tableau.
Et une qui fusionne les deux tableaux aussi.


Solution de l'exercice.


1)
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
import java.util.Scanner;
import java.util.Arrays;
public class exercMethodes {
       public static void main (String[] args) {
            Scanner lecture = new Scanner (System.in);
            System.out.println ("Entrer la taille du premier tableau : ");
            int taille1 = lecture.nextInt();
            System.out.println("Entrer la taille du second tableau : ");
            int taille2 = lecture.nextInt();
            int[] iTab1 = new int[taille1];
            int[] iTab2 = new int[taille2];
            int taille3 = taille1 + taille2;
            int[] iTab3 = new int[taille3];
            randomIntArray (iTab1);
            afficher(iTab1);
            randomIntArray (iTab2);
            afficher(iTab2);
            iTab3 = fusionner (iTab1, iTab2, iTab3);
            afficher (iTab3);
        }
        public static void randomIntArray (int[] tableau) {
               for(int i = 0; i < tableau.length; i++) {
                   tableau[i] = (int) (Math.random() * 100);
               }
               Arrays.sort(tableau);
        }
        public static int[] fusionner (int[] tableau1, in[] tableau2, int[] tableau3) {
            System.arraycopy(tableau1, 0,tableau3 , 0, tableau1.length);
            System.arraycopy(tableau2, 0, tableau3, tableau1.length, tableau2.length);
            Arrays.sort(tableau3);
           
        }
        public static void afficher (int[] tableau) {       
            for (int i = 0; i < tableau.length; i++ {
                 System.out.print(tableau[i] + " ");
            }
            System.out.print("\n");
        }
}
C'est déjà plus facile à lire que le code d'avant vous ne trouvez pas ?




Avec les fonctions/méthodes en Java, le code est donc plus facile à lire.
En effet au lieu de tout mettre dans le main ce qui est un peu bourrin, on va utiliser des fonctions/méthodes qui reprendront des bouts de code (les principales fonctionnalités standards du programme) qui seront à exécuter beaucoup de fois dans le programme.



Chapitre précédent     Sommaire     Chapitre suivant



Rédigé par Lo
Consulté 8444 fois



Hébergeur du site : Raspberry Pi
Version PHP : 5.4.4-14+deb7u7
Uptime : 8 jours 3 heures 15 minutes
Dernière sauvegarde : 23/04/2014



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

2663565 pages ont été consultées sur le site !
Dont 584 pages pendant les 24 dernières heures.

Page générée en 0.308 secondes


Nos partenaires
- Créer vos jeux avec html5 et android
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo
- Création d'un jeu de plateforme de A à Z avec SDL


  © 2005-2014 linor.fr - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.