6

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

4

6 回答 6

4

没有区别,但建议以静态方式调用static方法,即使用 ClassName。如果您不这样做,通常静态分析器会报告错误。

这里要理解的重要一点是static方法是无状态的,因此使用实例调用它们会使阅读您的代码的人感到困惑。因为无论您使用什么实例调用该static方法,结果都将保持不变。这是因为static方法属于类而不属于对象。

于 2013-07-10T07:12:31.060 回答
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
    }
}

由于这令人困惑,因此通常首选使用类来引用此类成员/方法。

于 2013-07-10T07:12:11.130 回答
1

完全没有区别。但是由于静态方法处于类级别,因此您可以使用类名访问它们。尽管使用类对象调用它们是可能的,但它会造成混乱。如果每个对象的值都相同,为什么要为每个对象调用它们?

于 2013-07-10T07:16:40.147 回答
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所以根本没有区别,并且总是使用 Class 表示法来避免混淆。

于 2013-07-10T07:11:42.940 回答
0

静态方法不对class. 它们只是绑定到类而不是该类的成员。这意味着他们无权访问non static. class除此之外,它们与non-static方法没有太大不同。

于 2013-07-10T07:13:37.653 回答
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 引用调用一个静态方法!但是即使我们使用特定的 Frog 实例来访问静态方法,规则也没有改变。这只是一个语法技巧,让您使用对象引用变量(但不是它所引用的对象)来获取静态方法或变量,但静态成员仍然不知道用于调用静态成员的特定实例。在 Frog 示例中,编译器知道引用变量 f 是 Frog 类型,因此 Frog 类静态方法在运行时不知道或关心 f 引用另一端的 Frog 实例。换句话说,编译器只关心引用变量 f 被声明为 Frog 类型。

我希望这能帮到您

于 2013-07-10T07:31:55.983 回答