静态变量和实例变量之间的java性能差异
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();
# 1 楼答案
由于实例方法可以是多态的overridden,一个非常简单的JVM实现必须至少在最初使用virtual mehod table来找到合适的方法来调用。然而,类本身不是多态的,类方法不能被重写。因此,they have a simpler lookup mechanism
然而,现实世界的JVM非常聪明,可以判断哪些方法永远不会被覆盖,并优化此查找。换句话说,除了最人为的、不存在JVM的情况外,在所有情况下,性能都会有所不同。相反,使用静态方法来表示与整个对象类本身相关的功能,而不是与单个对象实例相关的功能
# 2 楼答案
这不是性能的问题。静态变量和实例变量有不同的用途
使用
几乎可以肯定是没有用的,因为每次调用
new MyInstatnceClass()
都会创建一个新的MyInstatnceClass
实例,具有一个新的myNonStaticInt
实例变量。由于您没有保留对已创建实例的引用,因此无法检索同一实例变量两次,这使得它毫无用处如果您需要在类的所有实例之间共享变量的单个副本,
static
变量是一种方法也就是说,后一个调用也更具扩展性,因为它涉及创建和初始化
MyInstatnceClass
类的实例(如果该类是对该类的第一次访问,则加载和初始化该类)另一方面,
MyStaticClass.getMyStaticInt()
仅在类MyStaticClass
是该类的第一次访问时加载并初始化该类。它不必创建该类的任何实例