[java] question sur un petit code

Fermé
lotfy25 Messages postés 15 Date d'inscription vendredi 17 mars 2006 Statut Membre Dernière intervention 12 avril 2011 - 11 avril 2011 à 20:18
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 12 avril 2011 à 11:36
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 169 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 2 juin 2016 7
11 avril 2011 à 20:50
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 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
11 avril 2011 à 21:02
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 169 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 2 juin 2016 7
11 avril 2011 à 21:12
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 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
11 avril 2011 à 21:27
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 169 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 2 juin 2016 7
11 avril 2011 à 22:29
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 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
11 avril 2011 à 22:39
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 15 Date d'inscription vendredi 17 mars 2006 Statut Membre Dernière intervention 12 avril 2011 1
12 avril 2011 à 04:40
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 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
12 avril 2011 à 11:36
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