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

时间:2009-08-21 15:46:26

标签: java jvm static-methods

如果我有以下内容:

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
  }
}

使用实例调用foo()可能会出现什么问题吗? JVM是否将第一次调用foo()完全视为静态方法,还是存在一些技术上的微妙之处?

5 个答案:

答案 0 :(得分:8)

通过从实例调用静态方法很容易引入细微的逻辑错误。举个例子,这不符合你的想法:

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

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

答案 1 :(得分:2)

这两个电话是一样的。想到的问题是当重写A类时,你不能直接覆盖foo()。

答案 2 :(得分:1)

它只是被认为是糟糕的形式/做法。避免这种情况。

答案 3 :(得分:1)

一个很好的理由是,您可能会混淆可能需要阅读或更新代码的其他人。它真的“看起来”像实例化对象应该参与方法调用,而实际上它不是(实际上它可以为null)。这是不必要的混淆。

答案 4 :(得分:0)

不是100%肯定,但如果您的实例为空,则可能会遇到空指针异常。