在Java中,“使用类名调用静态方法”和“使用对象调用静态方法”有什么区别吗?

6
在Java中,我们可以使用类名“调用静态方法”,也可以使用对象“调用静态方法”。在Java中,“以类名调用静态方法”和“以对象调用静态方法”之间有什么区别呢?

相关:https://dev59.com/NGYr5IYBdhLWcg3wVY7K - Ian Roberts
6个回答

5
没有任何区别,但建议以静态方式调用static方法,即使用类名。通常,如果你不这样做,静态分析器会报告错误。
这里要理解的重要一点是,static方法是无状态的,因此使用实例调用它们对于阅读代码的人来说很令人困惑。因为无论你使用哪个实例调用static方法,结果都将保持不变。这是因为static方法属于一个类而不是一个对象。

没错。混淆的经典例子就是调用 anotherThread.sleep() - 当然,这是一个静态方法,所以睡眠的线程将是调用该方法的线程,而不是 anotherThread - vikingsteve

1

在内部,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。因此,根本没有区别,始终使用类符号以避免混淆。

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
    }
}

由于这样容易造成混淆,通常更喜欢使用类来引用此类成员/方法。


1
完全没有区别。但是由于静态方法在类级别上,因此您可以使用类名访问它们。虽然使用类对象调用它们是可能的,但会产生混淆。如果它的值将是相同的,为什么要为每个对象调用它们?

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引用来调用staticmethod!但是,即使我们使用特定的Frog实例来访问staticmethod,规则也没有改变。这只是一种语法技巧,让您使用对象引用变量(但不是它所引用的对象)来访问staticmethod或变量,但是staticmember仍然不知道用于调用staticmember的特定实例。在Frog示例中,编译器知道引用变量f的类型为Frog,因此Frog类staticmethod在不关心f引用另一端的Frog实例的情况下运行。换句话说,编译器只关心引用变量f被声明为Frog类型。希望这能帮到您。

0

静态方法并不作用于一个类。它们只是绑定到类而不是该类的成员。这意味着它们无法访问任何非静态成员。除此之外,它们与非静态方法并没有太大的区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接