有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

静态变量和实例变量之间的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();

共 (2) 个答案

  1. # 1 楼答案

    由于实例方法可以是多态的overridden,一个非常简单的JVM实现必须至少在最初使用virtual mehod table来找到合适的方法来调用。然而,类本身不是多态的,类方法不能被重写。因此,they have a simpler lookup mechanism

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

  2. # 2 楼答案

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

    使用

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

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

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

    也就是说,后一个调用也更具扩展性,因为它涉及创建和初始化MyInstatnceClass类的实例(如果该类是对该类的第一次访问,则加载和初始化该类)

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