Java - 能够访问静态方法的实例

时间:2014-01-28 13:48:05

标签: java static instance-variables nested-class

我刚刚开始使用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 MethodsStatic MethodsClass Methods中的Ruby不一样吗?

任何解释都将不胜感激:)

3 个答案:

答案 0 :(得分:6)

这是语言允许的:

ee.m1();

但你应该写:

Encloser.m1();

你的编译器应该发出如下警告,通知你:

  

source_file.java:37:警告:[静态]静态方法应该是   由类型名称Encloser限定,而不是由表达式限定       ee.m1();

答案 1 :(得分:3)

静态方法也可以被对象访问(但不应该是一个很好的编程实践),因为在编译时,这些变量类型被解析为类名

答案 2 :(得分:2)

在编译时,如果实例变量调用静态方法,则它们将替换为类名。

ee.m1();被解释为Enclosee.m1();