2

给定以下代码:

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主要方法的代码中实际使用了什么?

我知道这是一个非常丑陋的代码,但丑陋是 SCJP 书籍作者的标准选择。

4

2 回答 2

2

阴影作为一个概念并没有什么神奇之处。只是对名称的引用将始终引用最近的封闭范围内的实例。在您的示例中:

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

}

我用“tooth#N”形式为每个实例添加了一个数字注释。基本上,任何已经在其他地方定义的名称的引入都会使该范围其余部分的早期定义黯然失色。

于 2010-07-21T15:18:09.313 回答
1

当你在这一点上

System.out.println(tooth);

使用类属性 ( static final long tooth = 1L;),然后tooth声明一个新的,它隐藏类属性,这意味着它被使用而不是那个。

tooth方法内部,tooth变量作为值传递,它不会被修改,你可以通过执行mainwhich 看到这一点:

1
3
2
于 2010-07-21T15:21:41.110 回答