在准备参加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相关的方法(无论是静态还是非静态)/类都不知道。 - 正如任何“普通”方法变量具有有限的局部范围一样?
该片段意在混淆。所以我要确保我理解超越它的概念。
答案 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