从同一个类和不同类Java调用静态方法

时间:2013-01-18 15:34:34

标签: java static-methods

我有一个班级说ClassOneClassOne有两种方法,例如method1()method2(),这两种方法都是静态的,将一个接一个地调用(如下):

ClassOne.method1();
ClassOne.method2();

保证此序列不会改变。

现在我想知道上述情况和以下情况是否有任何性能差异:

第二种情况:

method1(){
    method2();
}

5 个答案:

答案 0 :(得分:3)

就性能而言,以任一方式进行方法调用都会产生相同的字节码,并且不会提供任何性能优势。

查看本文以便更好地理解 http://www.codeproject.com/Articles/30422/How-the-Java-Virtual-Machine-JVM-Works

就使用哪种样式而言,它取决于每种方法执行的功能。如果method1()依赖于method2()执行的任务,那么你将它连接起来,但如果没有,并且method2()做了一些需要在method1()完成之后执行的事情,那么你将它们分开来维护关注点分离。

答案 1 :(得分:2)

我怀疑是否存在任何差异主要是因为ClassOne是指向消息接收器的指针,而在第二种情况下,消息的接收者是范围内的此对象,它是类对象本身。但是,如果你想证明这是一个简单的应用程序,它会调用两个空方法几百万次,并比较两种方法之间的平均时间。

答案 2 :(得分:1)

不应有任何性能差异。现在如果方法2()总是在method1()之后执行,那么最好使用Second Case。

答案 3 :(得分:1)

在这种情况下,你最好的选择只是通过将“method2”的主体放在“method1”的末尾来重构它,并删除对“method2”的所有调用,并将“method1”重命名为反映的东西现在它正在进行这两个操作,同时重命名所有对“method1”的引用。

答案 4 :(得分:1)

您可以查看生成的字节码并自己做出结论:

源代码#1

public class Clazz {

    public static void main(String[] args){
        Clazz.method1();
        Clazz.method2();
    }

    public static void method1() {

    }

    public static void method2() {

    }
}

字节码#1

Compiled from "Clazz.java"

public class Clazz {
  public Clazz();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #16                 // Method method1:()V
       3: invokestatic  #19                 // Method method2:()V
       6: return

  public static void method1();
    Code:
       0: return

  public static void method2();
    Code:
       0: return
}

源代码#2

public class Clazz {

    public static void main(String[] args){
        Clazz.method1();
    }

    public static void method1() {
        method2();
    }

    public static void method2() {

    }
}

字节码#2

Compiled from "Clazz.java"

public class Clazz {
  public Clazz();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #16                 // Method method1:()V
       3: return

  public static void method1();
    Code:
       0: invokestatic  #21                 // Method method2:()V
       3: return

  public static void method2();
    Code:
       0: return
}


结果

生成的字节码与静态方法相同