静态变量和实例变量之间的性能差异

Performance difference between static and instance variables

An instance variable is one per Object, every object has its own copy of instance variable.

A static variable is one per Class, every object of that class shares the same Static variable.

class MyStaticClass{
  private static int myStaticInt;

  public static int getMyStaticInt() {return myStaticInt;}
}

class MyInstanceClass{
  private int myNonStaticInt;

  public int getMyNonStaticInt() {return myNonStaticInt;}
}

二者在性能上有区别吗?叫一个比叫另一个贵吗?

int i = MyStaticClass.getMyStaticInt();

或:

int i = new MyInstanceClass().getMyNonStaticInt();

这不是性能问题。静态变量和实例变量有不同的用途。

正在使用

int i = new MyInstatnceClass().getMyNonStaticInt();

几乎肯定是无用的,因为每次调用 new MyInstatnceClass() 都会创建一个新的 MyInstatnceClass 实例,并具有一个新的 myNonStaticInt 实例变量。由于您没有保留对创建的实例的引用,因此您无法两次检索相同的实例变量,这使得它毫无用处。

如果您需要在 class 的所有实例之间共享一个变量的单个副本,static 变量是可行的方法。

也就是说,后一个调用也更广泛,因为它涉及创建和初始化 MyInstatnceClass class 的实例(除了加载和初始化 class如果这是第一次访问 class)。

另一方面,如果 class 是 class 的第一次访问,MyStaticClass.getMyStaticInt() 只会加载和初始化 class MyStaticClass。它不必创建 class.

的任何实例

因为实例方法可以是多态的overridden, a very naive JVM implementation must at least initially use a virtual mehod table to find the appropriate method to call. Classes themselves, however are not polymorphic and class methods cannot be overridden. Due to this, they have a simpler lookup mechanism

但是,现实世界中的 JVM 非常聪明,可以判断哪些方法永远不会被覆盖并优化此查找。换句话说,除了最人为设计的不存在 JVM 的实例之外,在所有实例中,性能都会有所不同。相反,使用静态方法来表示与整个 class 对象本身相关的功能,而不是与其单个实例相关的功能。