如果我有以下内容:
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()完全视为静态方法,还是存在一些技术上的微妙之处?
答案 0 :(得分:8)
通过从实例调用静态方法很容易引入细微的逻辑错误。举个例子,这不符合你的想法:
Thread t = new Thread(...);
t.sleep(1000);
sleep
是一个静态方法,它暂停当前正在执行的线程,而不是线程实例。
答案 1 :(得分:2)
这两个电话是一样的。想到的问题是当重写A类时,你不能直接覆盖foo()。
答案 2 :(得分:1)
它只是被认为是糟糕的形式/做法。避免这种情况。
答案 3 :(得分:1)
一个很好的理由是,您可能会混淆可能需要阅读或更新代码的其他人。它真的“看起来”像实例化对象应该参与方法调用,而实际上它不是(实际上它可以为null)。这是不必要的混淆。
答案 4 :(得分:0)
不是100%肯定,但如果您的实例为空,则可能会遇到空指针异常。