[java] question sur un petit code

lotfy25 Messages postés 16 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,

J'ai deux question sur ce programme:

public class prog2{
public static void main(String [] argv){
Un x=new Un(); float y=10;
x.methode1(y);
System.out.println(y);
}
}
class Un {
int a;
public void methode1(float a)
{ a = this.a + 7 ;
System.out.println(a);}
}

RESULTAT/
7.0
10.0

1- la variable de classe "a" n'est pas initialisé pourquoi il n'affiche pas une erreur au niveau de l'affectation "a = this.a + 7"
2- pourquoi la variable "y" reste toujours 10.0 et elle n'a pas pris la valeur 7.0
A voir également:

3 réponses

triblekano Messages postés 188 Statut Membre 7
 
Bonjour
1-en java les entier non initialisé egaleron 0 donc this.a =0
2-pour la deux j'ai pas vraiment une bonne réponse car je sais pas trop comment se fait le passage de parametre mais si tu veux tu poura metre
public int methode1(float a)
{
a = this.a + 7 ;
System.out.println(a);
return a;
}
et
y=x.methode1(y);
aux lieux de x.methode1(y);
0
KX Messages postés 19031 Statut Modérateur 3 020
 
1) la variable 'a' est initialisée à 0 par le super constructeur.
2) la variable 'y' n'est pas modifiée car elle est copiée 'a=y' lors de l'appel de la fonction.
0
triblekano Messages postés 188 Statut Membre 7
 
non pour le 2 c'est a=this.a+7 est equivalent a y=a+7 car this.a c'est la variable de la classe pas le parametre
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Non, à ce moment là, le 'y' n'est plus pris en compte !!!

Un x=new Un(); // x.a <-- 0
float y=10;    // y <-- 10

x.methode1(y); // methode1.a <-- 10  : on prend la valeur de y
{
  a = this.a + 7 ; // methode1.a <-- 7 (x.a + 7 = 0 + 7 = 7)
  System.out.println(a); // affichage de methode1.a --> 7
  return a; // methode1.a --> 7
}

System.out.println(y); // affichage de y --> 10 : car y n'a jamais été modifié !

Remarque : une manière de s'en convaincre est d'imaginer ce qui se passerait si on faisait x.methode1(2); est-ce que tous les 2 deviendraient des 9 ? ça m'étonnerait ^^
0
triblekano Messages postés 188 Statut Membre 7
 
non j'ai dis que change l'instruction x.methode1(y);par
y=x.methode1(y);//y<-7
et pour x.methode1(2); aucune relation avec car ce n'est pas une variable renseigne toi sur le passage de paramétre par adresse et par valeur tu comprendra mieux
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Ne t'inquiètes pas pour moi, je suis très bien renseigné !
Il n'y a pas de passage par adresse en Java ! D'ailleurs les adresses et les pointeurs... ça n'existe pas !
En Java, on parle de passage par référence, et la valeur 2 est tout à fait correct pour un float.
Tu n'as qu'à tester x.methode1(2) si tu ne me crois pas... ça donnera le même résultat : 7
0
lotfy25 Messages postés 16 Statut Membre 1
 
Merci à vous deux
J'ai compris que tous les passages de paramètre de méthodes se font par copie et les variables d'origine ne sont jamais affectées
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Attention, ce n'est pas une copie en profondeur !
C'est pour ça qu'on parle de passage par référence et non de passage par copie...

Exemple :

public class prog2
{
  public static void methode2(Un u) // u est une copie
  {
    u.a = 3; // u.a n'est pas une copie
  }

  public static void methode3(Un u)
  {
    u = new Un();
  }

  public static void main(String [] argv)
  {
    Un x=new Un();	
    System.out.println(x.a); // x.a --> 0
    methode2(x); // u et x sont différents, mais u.a et x.a sont identiques !
    System.out.println(x.a); // x.a --> 3
    methode3(x); // on modifie u mais pas x, u.a ne correspond plus à x.a 
                 // donc u.a est initialisé à 0, mais ça n'affecte pas x.a
    System.out.println(x.a); // x.a --> 3
  }
}
0