2010-07-21 7 views
2

Vu le code suivant:Le concept de shadowing

public class A { 
static final long tooth = 1L; 

static long tooth(long tooth){ 
    System.out.println(++tooth); 
    return ++tooth; 
} 

public static void main(String args[]){ 
    System.out.println(tooth); 
    final long tooth = 2L; 
    new A().tooth(tooth); 
    System.out.println(tooth); 
} 
} 

Pouvez-vous s'il vous plaît me expliquer le concept de l'observation? Et une autre chose, ce tooth est réellement utilisé dans le code de la méthode principale?

Et je sais que c'est un code très moche, mais moche est le choix standard pour les auteurs de livres SCJP.

+0

double possible de [Qu'est-ce que shadowing?] (Http : //stackoverflow.com/questions/673779/what-is-shadowing) (bien que celui-ci soit pour C#, le concept est le même), et [Quel est l'ombrage variable utilisé dans une classe Java?] (http://stackoverflow.com/questions/1092099/what-is-variable-shadowing-used-for-in-a-java-class) –

+0

@ Péter Török - Existe-t-il un moyen de déterminer si une question est similaire à une précédente? Dans la section des questions connexes avant de poster, je n'ai pas trouvé (ou du moins je le pense) les liens que vous référencez. –

+0

Le moteur de recherche SO est connu pour avoir des lacunes. Certains suggèrent en fait d'utiliser google pour rechercher stackoverflow.com à la place. Cependant, la recherche par balise est utile. Dans ce cas, les deux questions liées ont la balise 'shadowing'. –

Répondre

2

Il n'y a rien de magique à propos de l'observation en tant que concept. C'est simplement qu'une référence à un nom référencera toujours l'instance dans la portée la plus proche. Dans votre exemple:

public class A { 
static final long tooth#1 = 1L; 

static long tooth#2(long tooth#3){ 
    System.out.println(++tooth#3); 
    return ++tooth#3; 
} 

public static void main(String args[]){ 
    System.out.println(tooth#1); 
    final long tooth#4 = 2L; 
    new A().tooth#2(tooth#4); 
    System.out.println(tooth#4); 
} 

}

J'ai annoté chaque cas avec un certain nombre, sous la forme « la dent N ». Fondamentalement, toute introduction d'un nom qui est déjà défini ailleurs éclipsera la définition précédente pour le reste de cette portée.

+0

C'était une bonne idée de numéroter les dents dans mon code, maintenant je comprends. Il semble que j'oublie toujours que java est passé par valeur, et c'est pourquoi je considère différents résultats de ceux que le compilateur retourne. Le problème était que je confondais la dent n ° 3 avec la dent n ° 4 et était un peu gênant pour moi que la dent n ° 4 soit modifiée, car elle a été déclarée statique. –

1

Lorsque vous êtes à ce point

System.out.println(tooth); 

la propriété de classe (static final long tooth = 1L;) est utilisé, une nouvelle tooth est déclarée, qui OMBRES la propriété de la classe, ce qui signifie qu'il est utilisé au lieu de cela.

Dans la méthode tooth la tooth variabile est passé comme valeur, il ne sera pas modifié, vous pouvez le voir en exécutant la main qui donne:

1 
3 
2