2017-07-03 8 views
0
package learning; 

public class This_keyword { 

     int x; 
     int y; 

     This_keyword(int x,int y){ 

       x = x; 
       y = y; 

       System.out.print("Value of 1st :" +x); 
       System.out.print("Value of 2nd :" +y); 
     } 

     public static void main(String args[]){ 
     This_keyword sample = new This_keyword(4,5); 
    } 
} 

Cela devrait imprimer 0,0 puisque je n'ai pas utilisé ce mot-clé, mais il est encore l'impression 4,5 qui sont passés en tant que constructeur paramétré.Le compilateur ne trouve pas d'ambiguïté parmi la variable d'instance et les paramètres passés lors de l'initialisation du constructeur?

maintenant un coup d'oeil au second code,

 package learning; 

    public class This_keyword { 

     int x; 
     int y; 

     This_keyword(int x,int y){ 

       x = x; 
       y = y; 
      } 

     void display(){ 
      System.out.print("Value of 1st :" +x); 
      System.out.print("Value of 2nd :" +y); 
     } 


     public static void main(String args[]){ 

      This_keyword sample = new This_keyword(4,5); 
      sample.display(); 
     } 
} 

Maintenant, il est prinitng 0,0 qui était attendu et vrai que ce mot-clé pas a été mentionné complier avait une ambiguïté la résolution même nom parmi variable d'instance et les paramètres . Pourquoi le compilateur était capable d'imprimer les valeurs dans le premier cas ??? même s'il y a une ambiguïté là-bas aussi !!

+0

Pertinent: https://stackoverflow.com/questions/42117386/why-are-my-fields-initialized-to-null-or-to-the-default-value-of-zero-when-ive –

+0

Dans les constructeurs utilisent la forme 'this.x = x'. –

+0

imprime 'this.x' et vous obtenez' 0'. – CoronA

Répondre

0

Dans votre premier exemple, vous utilisez System.out.print dans le constructeur. Puisque votre constructeur accepte une variable 'x' et une variable 'y', vous finissez par vous référer aux valeurs 'x' et 'y' qui ont été passées, pas aux champs de votre classe. Si vous avez modifié vos impressions pour utiliser 'this.x' et 'this.y' dans votre premier exemple, vous obtiendrez 0 et 0.

Dans votre deuxième exemple, vos impressions System.out sont situées dans un méthode différente. Remarquez comment votre méthode d'affichage n'accepte pas les variables 'x' et 'y' localement. Comme il n'y a pas de 'x' ou 'y' dans la méthode elle-même, le programme essayera d'utiliser les champs 'x' et 'y' de la classe elle-même, ce qui explique pourquoi vous obtenez 0 et 0.

Le mot-clé 'this' est le pointeur (j'utilise le mot "pointeur" en passant, pas 100% précis) à l'objet qui a fait l'appel. 'this' aide à éliminer l'ambiguïté lorsque vos variables locales sont les mêmes que vos champs ou lorsque vous traitez avec l'héritage. Pourquoi ne pas simplement utiliser un nom différent pour les variables locales alors? Vous pourriez, oui. Cependant, lorsque le nom de vos variables commence à devenir plus descriptif, et donc long, à mesure que la complexité de vos programmes augmente, il est logique de donner certains noms à certaines données sans en faire plus pour distinguer l'endroit où il se trouve tenu.

1

A l'intérieur du constructeur, tous occurrences non qualifiées de x et y se réfèrent aux paramètres , pas les variables d'instance. Suivez cette logique attentivement et vous verrez pourquoi vous avez obtenu les résultats que vous avez obtenus.

+0

Pouvez-vous élaborer un peu plus? –

0

Dans le premier cas, vos instructions println se trouvent dans le constructeur. Ils utilisent simplement x et y, plutôt que this.x et this.y, ce qui signifie qu'ils se réfèrent aux arguments x et y du constructeur, et non pas les x et y membres de This_keyword. Dans le second cas, les instructions d'impression sont dans une méthode distincte qui n'a aucun argument ou variable locale appelée x ou y. Donc ici, x et y réfèrent à la place des membres de la classe This_keyword.

+0

en utilisant "ceci" ou sans "ceci" ne fait pas de changement dans le premier cas, nous obtenons les mêmes valeurs que la sortie, alors quelle est l'utilisation de l'utilisation de ce mot clé de toute façon en java? –

+0

Vous utilisez 'this.x' pour renvoyer _specifcally_ au champ membre 'x', dans le cas où' x' nomme à la fois une variable locale (ou un paramètre de méthode) et un champ membre. –