Algorithmique et langage Java

Portée des variables

Toutes les variables déclarées dans le corps d'une méthode (variables locales de la méthode) sont inaccessibles depuis l'extérieur de la méthode.
Une méthode n'a pas accès aux variables locales des autres méthodes.
Une classe peut déclarer des variables en-dehors de toute méthode : elles deviennent alors des variables globales de la classe, accessibles à toutes les méthodes de la classe.
Une méthode static ne peut toutefois accéder qu'aux variables globales déclarées static .

class ExempleDePortees{
  static int effectif=12;
  static String groupe="ISN";  
  
 static void inscription(){
    int ancienEffectif=effectif;
    effectif=effectif+1;
    System.out.println("L\'ancien effectif du groupe "+groupe+" était "+ancienEffectif);
  }
  
  public static void main(String[] args){
    String message="L'effectif du groupe "+groupe+" est actuellement "+effectif;
    System.out.println(message);
    message="Procédons à une inscription";
    System.out.println(message);
    inscription();
    message="L'effectif du groupe "+groupe+" est maintenant "+effectif;
    System.out.println(message);
  }
  
 
}
Dans l'exemple ci-dessous les variables globales effectif et groupe sont accessibles depuis les deux méthodes main et inscription .
  En revanche message est accessible seulement depuis la méthode main et ancienEffectif seulement depuis la méthode inscrition .
  Toute tentative d'accéder à une variable en dehors de sa portée déclenche une erreur de compilation.

Passage par valeurs

Même lorsqu'une variable (de type primitif) est passée en paramètre à une méthode, elle lui reste en fait inaccessible : ce qui est transféré à la méthode n'est pas la variable par elle-même, mais une copie temporaire de même valeur, stockée dans un emplacement mémoire différent, mais qui a le même nom, pour la méthode, que la variable initiale. C'est ce qu'on appelle le passage par valeur des paramètres.
Ainsi même si la méthode modifie la valeur du paramètre qu'elle a reçu, la valeur de la variable initiale ne change pas.

class PasseParValeur{

  static int triple(int valeur){
    valeur=3*valeur;
    return valeur;
   }
   
  public static void main(String[] args){
    int i=25;
    int r=triple(i);
    System.out.println(i);	
    System.out.println(r);	
  }
}
Dans cette exemple la méthode triple multiplie par 3 la valeur de son paramètre avant de retourner cette nouvelle valeur.
  Quand on a passé l'entier i , valant 25, comme paramètre, on constate qu'après exécution de la méthode i est inchangé et vaut toujours 25.

Le passage par valeurs ne concerne sous Java que les variables de type primitif et les String.

Les autres types, comme les tableaux, sont passés par adresse : c'est leur adresse mémoire qui est en fait passée à la méthode. Cela implique qu'aucune copie n'est réalisée et que la méthode peut modifier leur contenu.

Exemple :

public class PasseParAdresse {
	
	public static void vide(char[] tableau){
		 for (int i=0;i<tableau.length;i=i+1){
			 tableau[i]=' ';
		 }
	}

	public static void main(String[] args) {
		char[] cobaye={'a','l','p','h','a','b','e','t'};
		for (int i=0;i<cobaye.length;i=i+1){
			System.out.print(cobaye[i]);
		}
		System.out.println(".");
		
		vide(cobaye);
		
		for (int i=0;i<cobaye.length;i=i+1){
			System.out.print(cobaye[i]);
		}
		System.out.println(".");
	}

}
La méthode "vide" remplace chaque élément du tableau passé en paramètre par un espace. Quand on affiche le contenu du tableau cobaye avant et après exécution de la méthode qui l'a reçu en paramètre, on constate qu'il a bien été modifié.
Une méthode a le droit de déclarer une variable ayant le même nom qu'une variable globale. Depuis le corps de la méthode la variable globale devient alors inaccessible, remplacée par la variable locale, qui "masque" la variable globale.
class Masquage{
static String texte;

  static String allonge(String sujet){ 
      String texte=" j\'ai ajouté quelque chose";
	  return(sujet+texte);
   }
   
  public static void main(String[] args){   
	texte="voilà le début ";
    String suite=allonge(texte);	
	System.out.println(texte);	
	System.out.println(suite);
  }
}
 
Licence Creative Commons
licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé
Auteur : Nathalie Bonnin
Professeur de Physique, Chimie, Informatique au lycée La Martinière Monplaisir (Lyon 8ème)
Contact :
nathalie.bonnin (chez) scientillula.net
Licence Creative Commons
La totalité du contenu du site Scientillula.net appartient à Nathalie Bonnin et est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé