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

jav*_*nix 5 java static

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

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

public MyClass() { this.staticMethod(); }
Run Code Online (Sandbox Code Playgroud)

VS

public MyClass() { MyClass.staticMethod(); }
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

bak*_*kal 11

静态方法并不依赖于类的实例,因此从一个实例调用它this比调用它更没意义Class.staticMethod(),更具可读性.


Tof*_*eer 6

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

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

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

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


Ash*_*Ash 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"; }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您将代码更改为B b = new B();它将打印出"B".

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