这两个静态方法调用之间有什么区别吗?

时间:2018-07-12 06:17:46

标签: java static

在以下代码中,ABC.getSomeNumber();getSomeNumber();之间没有任何区别。我知道让类名在同一类中调用静态方法似乎是多余的,但是如果我们显式使用类名,是否会出现性能问题或其他问题?相对于ABC.getSomeNumber();getSomeNumber();,在编译时如何解决这些问题?

public class ABC {
   public static int getSomeNumber(){
     return 10;
   }

   public static void anotherMethod(){
     ABC.getSomeNumber();
     getSomeNumber();
   } 
}

3 个答案:

答案 0 :(得分:3)

在这种情况下没有区别。

如果从其他类(直接或通过静态导入)进行调用,则将需要该名称。

您可以在同一类中使用任何一种形式。这实际上取决于偏好。如果您从许多类中调用名称相似的方法,则可以选择显式地使用类名称,因为这样可以帮助您在更轻松地阅读时消除歧义。

对性能没有影响,因为它们一旦编译就变得相同。

答案 1 :(得分:2)

让我们看一下字节码,看是否有区别:

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

  public static int getSomeNumber();
    Code:
       0: bipush        10
       2: ireturn

  public static void anotherMethod();
    Code:
       0: invokestatic  #17                 // Method getSomeNumber:()I
       3: pop
       4: invokestatic  #17                 // Method getSomeNumber:()I
       7: pop
       8: return
}

invokestatic的{​​{3}}说:参数

  

(...)用于构造索引   放入当前类的运行时常量池中。 (...)该索引处的运行时常量池项必须是符号   对方法或接口方法(...)的引用,   方法的名称(...)以及   对方法所在的类或接口的符号引用   被发现。命名方法已解决。

两个调用都以相同的方式引用到常量池的同一项目(#17)。静态本地方法getSomeNumber是合格的还是不合格的,字节码没有什么区别。

答案 2 :(得分:1)

不,没有区别。 ClassName.methodName()仅在您从类外部调用时使用。