实例变量是每个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();
答案 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的实例外,性能会有所不同。相反,使用静态方法来表示与整个对象类本身相关的功能,而不是单个实例。