(本地)变量优先于类成员

时间:2014-08-14 23:24:49

标签: java scopes

在准备参加Java考试时,我刚刚遇到了这个片段

class Person {
  static class Male {
    static String Desc = "Male"; 
  }
  static Gender Male = new Gender(); 
  }

class Gender {
  String Desc = "Gender"; 
}

public static void main(String[] args) 
{
  System.out.println(Person.Male.Desc); // returns: Gender
}

}

用于描述局部变量优先于类成员。

重叠范围对我来说是显而易见的。但为什么我们会在这里调用Desc一个局部变量?是因为任何与Person相关的方法(无论是静态还是非静态)/类都不知道。 - 正如任何“普通”方法变量具有有限的局部范围一样?

该片段意在混淆。所以我要确保我理解超越它的概念。

4 个答案:

答案 0 :(得分:0)

首先,你的例子甚至都没有编译。

我假设你的意思是:

public class Person {

    static class Male {
        static String Desc = "Male"; 
    }

    static class Gender {
      String Desc = "Gender"; 
    }

    static Gender Male = new Gender(); 

    public static void main(String[] args) 
    {
      System.out.println(Person.Male.Desc); // returns: Gender
    }
}

重叠位于Male而不是Desc。 如果您删除(或注释掉static Gender Male = ...),则输出为"男性"。 Person.Male引用静态成员变量Male而不是静态内部类Male。从这个意义上说,变量优先于类。

如果@EJP会输入并解释如何使用Person $ Male来引用该类而不是变量和正确的名称#34;优先级"非常感谢。

答案 1 :(得分:0)

以下是使用反射访问Person $ Male的方法:

public class Person
{
    static class Male
    {
        static String Desc = "Male";
    }

    static class Gender
    {
        String Desc = "Gender";
    }

    static Gender Male = new Gender();

    public static void main(String[] args)
    {
        System.out.println(Person.Male.Desc); // returns: Gender
        try
        {
            Person.Male male = (Person.Male) Class.forName("Person$Male").newInstance();
            System.out.println(male.Desc); // returns: Male
        }
        catch (InstantiationException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

答案 2 :(得分:0)

  

正确的地方可以说本地优先于静态变量,正如您在此代码中所看到的那样。在第2行声明局部变量之前,snap方法获得teeth = 1(类级别牙齿变量的副本)但在第2行声明局部变量后,它会拾取局部变量而不是静态牙齿。   是的,它可以被称为阴影,其中更高级别的范围变量被隐藏。

public class StaticVariable {
static int teeth;
public StaticVariable(){
    teeth++;
}
public void snap( int teeth){
    System.out.println(teeth+"");
    teeth--;
}
public static void main(String[] args){

    new StaticVariable().snap(teeth);//Line 1  teeth--> 1
    int teeth=3;//Line 2
    new StaticVariable().snap(teeth);//Line 3. teeth--> 3

}

答案 3 :(得分:-1)

它被称为"暗影"。请参阅教程:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html