3

如果我有以下情况:

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() 完全视为静态方法,还是有一些技术上的微妙之处?

4

5 回答 5

8

通过从实例调用静态方法很容易引入细微的逻辑错误。举个例子,这不会像您认为的那样:

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

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

于 2009-08-21T15:56:04.300 回答
2

两个调用是一样的。想到的问题是在覆盖类 A 时,不能直接覆盖 foo()。

于 2009-08-21T15:48:19.730 回答
1

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

于 2009-08-21T15:58:25.543 回答
1

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

于 2009-08-21T16:56:29.593 回答
0

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

于 2009-08-21T15:49:49.227 回答