在Java中,我们可以使用类名“调用静态方法”,也可以使用对象“调用静态方法”。在Java中,“以类名调用静态方法”和“以对象调用静态方法”之间有什么区别呢?
static
方法,即使用类名。通常,如果你不这样做,静态分析器会报告错误。static
方法是无状态的,因此使用实例调用它们对于阅读代码的人来说很令人困惑。因为无论你使用哪个实例调用static
方法,结果都将保持不变。这是因为static
方法属于一个类而不是一个对象。anotherThread.sleep()
- 当然,这是一个静态方法,所以睡眠的线程将是调用该方法的线程,而不是 anotherThread
。 - vikingsteve在内部,new ClassName().staticMethod();
被视为 ClassName.staticMethod()
。所以没有区别。它只会导致混淆。
考虑一个例子
public class StaticDemo {
static int staticVar = 10;
public static void main(String [] args){
System.out.println(new StaticDemo().staticVar);
System.out.println(StaticDemo.staticVar);
}
}
这将输出
10
10
`
即使您编写new StaticDemo().staticVar
,它也会被视为 StaticDemo.staticVar
。因此,根本没有区别,始终使用类符号以避免混淆。public class X
{
public static final String foo = "foo";
public static String bar() { return "bar"; }
public static void main(final String... args)
{
final X x = new X();
System.out.println(X.foo); // "foo"
System.out.println(x.foo); // "foo" too -- same reference
System.out.println(X.bar()); // "bar"
System.out.println(x.bar()); // "bar" too -- same reference
}
}
由于这样容易造成混淆,通常更喜欢使用类来引用此类成员/方法。
class Frog {
static int frogCount = 0; // Declare and initialize
// static variable
public Frog() {
frogCount += 1; // Modify the value in the constructor
}
}
class TestFrog {
public static void main (String [] args) {
new Frog();
new Frog();
new Frog();
System.out.print("frogCount:"+Frog.frogCount); //Access
// static variable
}
}
Frog f = new Frog();
int frogs = f.frogCount; // Access static variable
// FrogCount using f
静态方法并不作用于一个类。它们只是绑定到类而不是该类的成员。这意味着它们无法访问任何非静态成员。除此之外,它们与非静态方法并没有太大的区别。