Java - 实例能否访问静态方法

3

我刚开始学习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();
  }

}

运行上述代码不会出现任何错误/异常。它只是运行而已。这里的困惑是,实例是如何能调用静态方法的?难道静态方法不像Ruby中的类方法吗?
欢迎提供任何解释 :)
3个回答

6

这就是语言的作用:

ee.m1();

但你应该写成这样:
Encloser.m1();

您的编译器应该像下面这样发出警告,以通知您:

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


谢谢@marcin_j的及时回复 :) 但只是提供一下信息,我没有收到任何警告 :| - Gaurav Manchanda
也许这取决于IDE / Java编译器 / 使用的参数,我将您的代码粘贴到http://rextester.com/runcode中。 - marcinj

3

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


它稍微好一些,但OP对“通过对象访问”感到困惑,这根本不会发生,然而你的答案读起来是另一回事。这里根本没有涉及任何对象,甚至变量也是可选的。((Encloser)null).m1()最能凸显出这一点。 - Marko Topolnik

2

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接