请问一下
编译器认为变量在第一层中被定义,不能在第二层定义,为什么下面的这种情况又是合法的呢
class person
{
  int age;
  void shout()
  {
   int age=60;
   System.out.println("my age is"+age);
  }
}
在java书上看到这么写得

解决方案 »

  1.   

    这个叫做遮蔽一个变量、方法或类型可以分别遮蔽(shadow)在一个闭合的文本范围内的具有相同名字的所有变量、方法或类型。如果一个实体被遮蔽了,那么你用它的简单名是无法引用到它的;根据实体的不同,有时你根本就无法引用到它:class WhoKnows {static String sentence = "I don't know.";public static woid main(String[ ] args) {String sentence = “I know!”; // shadows static fieldSystem.out.println(sentence); // prints local variable}}尽管遮蔽通常是被劝阻的,但是有一种通用的惯用法确实涉及遮蔽。构造器经常将来自其所在类的某个域名重用为一个参数,以传递这个命名域的值。这种惯用法并不是没有风险,但是大多数Java 程序员都认为这种风格带来的实惠要超过其风险:class Belt {private final int size;public Belt(int size) { // Parameter shadows Belt.sizethis.size = size;}}