【发布时间】:2013-07-10 07:09:50
【问题描述】:
在 java 中,我们可以“使用类名调用静态方法”,也可以“使用对象调用静态方法” java中“使用类名调用静态方法”和“使用对象调用静态方法”有什么区别?
【问题讨论】:
在 java 中,我们可以“使用类名调用静态方法”,也可以“使用对象调用静态方法” java中“使用类名调用静态方法”和“使用对象调用静态方法”有什么区别?
【问题讨论】:
没有区别,但建议以静态方式调用 static 方法,即使用 ClassName。如果你不这样做,一般静态分析器会报错。
这里要理解的重要一点是static 方法是无状态的,因此使用实例调用它们会使阅读您的代码的人感到困惑。因为无论您使用什么实例调用static 方法,结果都将保持不变。这是因为static 方法属于一个类而不属于一个对象。
【讨论】:
anotherThread.sleep()——当然,这是一个静态方法,所以调用线程(而不是anotherThread)将是休眠的。
完全没有区别。但是由于静态方法处于类级别,因此您可以使用类名访问它们。尽管使用类对象调用它们是可能的,但它会造成混乱。如果每个对象的值都相同,为什么要为每个对象调用它们?
【讨论】:
在内部,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。所以根本没有区别,并且总是使用类符号来避免混淆。
【讨论】:
不,没有。除了可能的混淆...如果您使用实例访问它们,此类代码的读者无法可靠地将静态成员/方法与非静态成员/方法区分开来:
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
}
}
由于这很容易混淆,因此通常首选使用类来引用此类成员/方法。
【讨论】:
静态方法不会在 class 上运行。它们只是绑定到类而不是该类的成员。这意味着他们无权访问class 的任何non static 成员。除此之外,它们与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 的声明 作为类型的青蛙。
希望对你有帮助
【讨论】: