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

时间:2017-10-22 08:48:56

标签: java static instance instance-variables

  

实例变量是每个Object一个,每个对象都有自己的实例变量副本。

     

静态变量是每个Class一个,该类的每个对象共享相同的Static变量。

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();

2 个答案:

答案 0 :(得分:2)

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

使用

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

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

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

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

另一方面,MyStaticClass.getMyStaticInt()只会加载并初始化类MyStaticClass,如果它是该类的第一次访问。它不必创建该类的任何实例。

答案 1 :(得分:1)

由于实例方法可以是多态overridden,因此非常天真的JVM实现必须至少最初使用virtual mehod table来查找要调用的适当方法。但是类本身多态,并且不能覆盖类方法。因此,they have a simpler lookup mechanism

然而,真实世界的JVM非常聪明,可以告诉哪些方法永远不会被覆盖并优化此查找。换句话说,除了最常用的不存在JVM的实例外,性能会有所不同。相反,使用静态方法来表示与整个对象类本身相关的功能,而不是单个实例。