我刚刚开始使用Java,正在查看Nested Classes
主题,并尝试了一些东西,突然之间发生了这样的事情:
class Encloser
{
static int i;
static void m1()
{
System.out.println(i);
}
static void m2()
{
Enclosee.accessEncloser();
}
static class Enclosee
{
static void accessEncloser()
{
i = 1;
m1();
}
static void accessEncloserNew()
{
m2();
}
}
}
class EncloserTest
{
public static void main(String[] args)
{
Encloser ee = new Encloser();
Encloser.Enclosee e = new Encloser.Enclosee();
ee.m1();
ee.m2();
e.accessEncloser();
e.accessEncloserNew();Encloser.m1();
Encloser.m2();
Encloser.m1();
Encloser.Enclosee.accessEncloserNew();
Encloser.Enclosee.accessEncloser();
}
}
运行上面的代码不会给出任何错误/异常。它只是运行。这里的混乱是,实例如何能够在这里调用Static Methods
? Static Methods
与Class Methods
中的Ruby
不一样吗?
任何解释都将不胜感激:)
答案 0 :(得分:6)
这是语言允许的:
ee.m1();
但你应该写:
Encloser.m1();
你的编译器应该发出如下警告,通知你:
source_file.java:37:警告:[静态]静态方法应该是 由类型名称Encloser限定,而不是由表达式限定 ee.m1();
答案 1 :(得分:3)
静态方法也可以被对象访问(但不应该是一个很好的编程实践),因为在编译时,这些变量类型被解析为类名。
答案 2 :(得分:2)
在编译时,如果实例变量调用静态方法,则它们将替换为类名。
ee.m1();
被解释为Enclosee.m1();