Petites questions à propos de java

Fermé
aurelie689 - 30 oct. 2008 à 12:46
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 - 30 oct. 2008 à 20:54
Bonjour,
je débute en java et j'ai quelques questions, j'ai appris l'an dernier le pascal et certains concepts du java m'échappent par rapport à ce langage, par exemple comment faire pour qu'après avoir exécuté une procédure les arguments de celles-ci gardent les modifications apportées par l'execution de cette procédure? Faut-il toujours ajouter une ligne avec return(variable)? Car cela alourdit beaucoup les procédures lorsque je souhaite récupérer la valeur de plusieurs arguments :s. De plus le ruturn marche -t'il aussi avec des booléens?
Merci d'avance à ceux qui prendront le temps de répondre à mes questions. :)
A voir également:

1 réponse

Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 328
30 oct. 2008 à 20:54
Salut Aurélie689,
Je ne connais pas le pascal donc je ne m'avancerai pas à faire de comparaisons.
Tout d'abord, en Java, il n'y a pas de procédure mais des méthodes : en règle générale ces méthodes sont relatives à l'objet dans lequel elles sont définies (principe d'encapsulation). Mais bon, c'est surtout une question de vocabulaire.

En ce qui concerne les modifications apportées par l'exécution d'une méthode, c'est assez compliqué, mais les principes sont communs à d'autres langages (par exemple C++).
En informatique, tu as 2 structures gérant la mémoire dans lesquels sont stockées tes données. La pile et le tas. En Java et C++, dès que tu instancies une classe (avec new), ton instance est créée dans le tas. Si tu utilises un type primitif, celui-ci est stocké dans la pile.

En informatique, tu as plusieurs méthodes pour passer des arguments à une méthode.
- La première méthode est le passage par recopie :
Le principe est simple, tu as une variable déclarée et initialisée dans une méthode A, et tu la passes en paramètre à la méthode B. La variable est alors copiée sur la pile (stack), et c'est cette copie qui va être utilisée par B (donc B n'utilise pas vraiment la variable initialisée dans A). Dans ce cas, si en sortie de B tu ne retournes pas la valeur, et que tu ne l'affectes pas à la variable initialisée dans A, les modifications apportées ne seront stockées nulle part.
Je pense que c'est ce type de passage qui est utilisé en Pascal par exemple.

- La seconde est le passage par pointeur :
Ici on va passer en paramètre à B non plus notre variable, mais son adresse (le pointeur vers notre variable). L'avantage majeur que ça a, c'est que si ta variable de base est un objet énorme, tu ne vas pas la recopier dans la pile pour la modifier, puis écraser son ancienne valeur (je te laisse par exemple imaginer comment ton ordinateur ramerait si tu avais un fichier de plusieurs centaines de méga octets en mémoire) : tu vas modifier directement l'objet. Ainsi, comme les modifications sont apportées directement sur l'objet de base, tu n'as pas besoin de le retourner.
Le second avantage du passage par pointeur, c'est de permettre au programmeur de développer super efficacement en optimisant son code à fond en jouant directement avec les adresses mémoire pour stocker des données...
L'inconvénient, c'est que si tu n'es pas expert là dedans, c'est difficile, et que souvent tu vas laisser des failles que les hackers (qui eux sont experts là dedans) vont déceler pour exploiter ton application.

- La 3ème méthode est le passage par référence :
En gros c'est comme un passage par pointeur, sauf que tu n'as pas l'autorisation d'écrire directement à l'adresse que tu veux et donc c'est plus sécurisé (je n'en connais pas vraiment plus donc je vais m'arrêter là).

En java, et à part pour les types primitifs, le passage en paramètre se fait par référence. Autrement dit, si ton objet a été créé en dehors de la méthode B, celle-ci va la modifier et n'aura pas besoin de la retourner. Par contre, tout objet déclaré dans la méthode B et non retourné sera effacé par le garbage collector.

Le return fonctionne aussi bien avec des instances de classes qu'avec des types primitifs (donc avec des booléens).

Cordialement,
3