代码之家  ›  专栏  ›  技术社区  ›  Jeremy Powell

在Java中用对象调用静态方法会出现什么问题?

  •  3
  • Jeremy Powell  · 技术社区  · 15 年前

    如果我有以下资料:

    class A {
      public A() { }
      public static void foo() { System.out.println("foo() called"); }
    }
    
    public class Main {
      public static void main(String [] args) {
        A a = new A();
        a.foo(); // <-- static call using an instance.
        A.foo(); // <-- static call using class
      }
    }
    

    5 回复  |  直到 15 年前
        1
  •  8
  •   Juliet    15 年前

    通过从实例调用静态方法,很容易引入微妙的逻辑错误。举个例子,这并不像你想象的那样:

    Thread t = new Thread(...);
    t.sleep(1000);
    

    sleep 是一个静态方法,它暂停当前正在执行的线程,而不是线程实例。

        2
  •  2
  •   Alex B    15 年前

        3
  •  1
  •   Eric Anderson    15 年前

    这被认为是不好的形式/做法。避免这种情况。

        4
  •  1
  •   Alex Feinman    15 年前

    一个很好的理由是,您可能会混淆其他可能需要阅读或更新您的代码的人。实际上,实例化对象“似乎”应该包含在方法调用中,而实际上它不是(事实上它可以为null)。这是不必要的混淆。

        5
  •  0
  •   patros    15 年前

    不是100%确定,但如果实例为null,则可能会遇到null指针异常。