为什么最好在方法类的实例中静态调用静态方法?

时间:2010-04-23 02:52:34

标签: java static

如果我用Java创建一个类的实例,为什么最好静态地调用同一个类的静态方法,而不是使用this.method()?

当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我收到Eclipse的警告。

public MyClass() { this.staticMethod(); }

VS

public MyClass() { MyClass.staticMethod(); }

任何人都可以解释为什么这是一件坏事吗?在我看来,编译器应该已经分配了一个对象的实例,因此静态分配内存将不需要开销。

编辑:

我听到的要点是,这是不好的做法,主要是因为可读性,这是可以理解的。我真正想要问的是(尽管不是很清楚)在调用MyClass.staticMethod()或this.staticMethod()之间的'编译'有什么不同之处。

5 个答案:

答案 0 :(得分:11)

静态方法与类的实例无关,因此从this调用它比从Class.staticMethod()调用它更不合理,更多也是可读的。

答案 1 :(得分:6)

MyClass.staticMethod()清楚地表明您正在调用静态(不可重写)方法。

this.staticMethod()误导读者认为它是一个实例方法。

staticMethod()也在误导方面(虽然我通常这样做)。

如果您认为人们在阅读您的代码时不熟悉它,您倾向于尝试使代码更清晰,这是通过使用ClassName.method而不是instance.method来更清楚代码的情况。

答案 2 :(得分:5)

除了提到的其他答案明确表示你使用的是静态方法之外,还要注意静态方法不是多态的,因此使用类名显式可以消除任何关于哪种方法的混淆。被称为。

在下面的代码中,如果你期望非静态方法的多态性,b.test()将返回“A”并不是很明显:

public class TestStaticOverride
{
  public static void main( String[] args )
  {
    A b = new B();
    System.out.println( "Calling b.test(): " + b.test() );
  }

  private static class A
  {
    public static String test() { return "A"; }
  }

  private static class B extends A
  {
    public static String test() { return "B"; }
  }
}

如果您将代码更改为B b = new B();,则会打印出“B”。

(“覆盖”静态方法是否一个好主意可能是另一天的讨论......)

答案 3 :(得分:3)

静态方法实际上不是你的实例的一部分 - 它无论如何都无法访问你的任何实例变量,所以我敢认为从构造函数中调用它并没有多大意义。

如果需要初始化静态对象,请使用

private static List l = new ArrayList();   static { l.add("something"); }

如果你仍然需要调用它,那么调用本地静态方法就没有前缀你的本地类名,就像这样(没有日食警告)

public MyClass() { staticMethod(); }

答案 4 :(得分:2)

因为this.通常引用实例方法,所以这样做是个坏主意。