在java中,我们能够“调用带有类名的静态方法”以及“使用对象调用静态方法”“使用类名调用静态方法”和“使用对象调用静态方法”有什么区别?在java中?
6 回答
没有区别,但建议以静态方式调用static
方法,即使用 ClassName。如果您不这样做,通常静态分析器会报告错误。
这里要理解的重要一点是static
方法是无状态的,因此使用实例调用它们会使阅读您的代码的人感到困惑。因为无论您使用什么实例调用该static
方法,结果都将保持不变。这是因为static
方法属于类而不属于对象。
不,没有。除了可能的混淆......如果您使用实例访问它们,此类代码的读者无法可靠地将静态成员/方法与非静态成员/方法区分开来:
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
}
}
由于这令人困惑,因此通常首选使用类来引用此类成员/方法。
完全没有区别。但是由于静态方法处于类级别,因此您可以使用类名访问它们。尽管使用类对象调用它们是可能的,但它会造成混乱。如果每个对象的值都相同,为什么要为每个对象调用它们?
在内部,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 表示法来避免混淆。
静态方法不对class
. 它们只是绑定到类而不是该类的成员。这意味着他们无权访问non static
. class
除此之外,它们与non-static
方法没有太大不同。
在 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 类型。
我希望这能帮到您