答案 0 :(得分:3)
没有区别,但建议是以staic方式调用static
方法,即使用ClassName。如果您不这样做,静态analayzers通常会报告错误。
这里要理解的一件重要事情是static
方法是无状态的,因此用实例调用它们会让读取代码的人感到困惑。因为无论您使用什么实例来调用static
方法,结果都将保持不变。这是因为static
方法属于某个类,但不属于对象。
答案 1 :(得分:1)
不,没有。除了可能的混淆之外......如果您使用实例访问静态成员/方法,那么此类代码的读者无法可靠地告诉静态成员/方法:
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
}
}
由于这令人困惑,通常最好使用该类来引用这些成员/方法。
答案 2 :(得分:1)
完全没有区别。但由于静态方法属于类级别,因此可以使用类名访问它们。尽管使用类对象调用它们是可能的,但它会造成混淆。如果它的值相同,你为什么要为每个对象调用它们?
答案 3 :(得分:0)
在内部,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
。因此完全没有区别,并且始终使用Class符号来避免混淆。
答案 4 :(得分:0)
静态方法不在class
上运行。它们只是绑定到类而不是该类的成员。这意味着他们无权访问non static
的任何class
成员。除此之外,它们与non-static
方法没有什么不同。
答案 5 :(得分:0)
在SCJP指南中。举个例子如下:
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
}
}
但是为了让它真正令人困惑,Java语言也允许 您可以使用对象引用变量来访问静态成员
Frog f = new Frog();
int frogs = f.frogCount; // Access static variable
// FrogCount using f
在前面的代码中,我们实例化一个Frog,分配新的Frog 对象到引用变量f,然后使用f引用 调用静态方法!但即使我们使用特定的青蛙 实例访问static方法,规则没有改变。这个 只是一种让你使用对象引用变量的语法技巧 (但不是它所指的对象)去静态方法或 变量,但静态成员仍然没有意识到特定的 用于调用静态成员的实例。在青蛙的例子中, 编译器知道引用变量f的类型为Frog,等等 Frog类staticmethod在没有意识或关注的情况下运行 f引用另一端的Frog实例。其他 单词,编译器只关心声明引用变量f 就像青蛙一样。
我希望这会对你有所帮助