假设这里的所有方法调用都是静态的,如下所示:
public class Util {
public static void method1() {
}
}
以静态方式访问:
Util.method1();
Util.method2();
Util.method3();
以非静态方式访问
Util util = new Util();
util.method1();
util.method2();
util.method3();
两种方式都有任何性能差异吗?我知道这样做的第一种方法是正确访问它。但第二种方法只实例化一次util对象而不是三次。除了正确访问这些方法之外,我找不到任何指向任何东西的东西。据我所知,没有功能差异,但存在逻辑差异。如果有人知道的话,寻找任何一种方式的成本与收益。
答案 0 :(得分:12)
两种方式都有任何性能差异吗?
是的 - 由于构建了一个毫无意义的实例,第二个稍慢。
我知道这样做的第一种方法是正确访问它。但第二种方法只实例化一次util对象而不是三次。
不,第二种方式创建Util
的一个实例,而第一种方式不创建任何实例。
第一种方式显着更好,因为它清楚地表明它是一个静态方法。请考虑以下代码:
Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);
最后一次通话看起来像什么?肯定会让新线程睡觉,对吧?不......它只是调用Thread.sleep()
,它只会使当前线程休眠。
当您修改静态方法调用以“通过”引用时,引用的值将被完全忽略 - 它甚至可以为null:
Util util = null;
util.method1(); // This will still work...
答案 1 :(得分:0)
您显示的代码没有区别,因为所有这些方法都是静态的。 (但编译器会为第二组发出警告。)我认为静态方法有一个小的性能优势。我认为静态访问的基础字节代码invokeSpecial应该比invokeVirtual更快,后者必须进行某种类型的解码。
但是担心这还不够。使用适合您设计的任何类型的方法(静态与实例)。不要试图像这样优化方法调用。