ClassName.m()
和(new ClassName()).m()
m()
之间的区别是静态方法。
答案 0 :(得分:6)
不同之处在于,在第二个示例中,您在内存中创建了一个不必要的对象。
它仍然为ClassName
类调用相同的静态方法。
建议使用ClassName.m()
以避免不必要的对象创建,并为开发人员提供上下文,指示确实正在调用静态方法。
答案 1 :(得分:2)
三件事:
考虑以下原因1:
class ClassName {
static int nextId;
static int m() { return nextId; }
int id;
ClassName() { id = nextId; nextId++; }
/**
C:\junk>java ClassName
2
2
3
*/
public static void main(String[] args) {
new ClassName();
new ClassName();
System.out.println(ClassName.m());
System.out.println(ClassName.m());
System.out.println((new ClassName()).m());
}
}
考虑以下内容,添加到原因2,如@emory所暗示的那样:
class ClassName {
// perhaps ClassName has some caching mechanism?
static final List<ClassName> badStructure = new LinkedList<ClassName>();
ClassName() {
// Note this also gives outside threads access to this object
// before it is fully constructed! Generally bad...
badStructure.add(this);
}
public static void main(String[] args) {
ClassName c1 = new ClassName(); // create a ClassName object
c1 = null; // normally it would get GC'd but a ref exist in badStructure! :-(
}
}
考虑以下因素,原因3:
class BadSleep implements Runnable {
int i = 0;
public void run() {
while(true) {
i++;
}
}
public static void main(String[] args) throws Exception {
Thread t = new Thread(new BadSleep());
t.start();
// okay t is running - let's pause it for a second
t.sleep(1000); // oh snap! Doesn't pause t, it pauses main! Ugh!
}
}
答案 2 :(得分:1)
从外部观察者的角度来看,没有区别。两种方式都会导致对方法的调用,在任何一种情况下都只能执行完全相同的操作。但是,你永远不应该做第二个,因为在这种情况下创建一个对象是没有意义的。
答案 3 :(得分:0)
如果m()
是静态方法,则使用ClassName.m()
通常是正确的做法,因为m()
是ClassName
的方法,而不是ClassName
的对象