在java中“用类名调用静态方法”和“用对象调用静态方法”之间有什么区别吗?

时间:2013-07-10 07:09:50

标签: java static

在java中我们能够“调用带有类名的静态方法”并“调用带有对象的静态方法” 在java中“用类名调用静态方法”和“用对象调用静态方法”有什么区别?

6 个答案:

答案 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   就像青蛙一样。

我希望这会对你有所帮助

相关问题