Концепция слежки - PullRequest
2 голосов
/ 21 июля 2010

С учетом следующего кода:

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);
 }
}

Не могли бы вы объяснить мне концепцию слежки? И еще, что tooth на самом деле используется в коде из метода main?

И я знаю, что это очень уродливый код, но уродливый - стандартный выбор для авторов книг SCJP.

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Нет ничего волшебного в том, чтобы скрывать как концепцию. Просто ссылка на имя всегда будет ссылаться на экземпляр в ближайшей области видимости. В вашем примере:

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);
}

}

Я аннотировал каждый экземпляр номером в форме "зуб № N". В основном любое введение имени, которое уже определено где-то еще, затмевает более раннее определение для остальной части этой области.

1 голос
/ 21 июля 2010

Когда вы находитесь в этой точке

System.out.println(tooth);

используется свойство класса (static final long tooth = 1L;), затем объявляется новое tooth, которое скрывает свойство класса, что означает, что оно используется вместо этого.

Внутри метода tooth переменная tooth передается как значение, оно не будет изменено, это можно увидеть, выполнив main, который дает:

1
3
2
...