在以下代码中,ABC.getSomeNumber();
和getSomeNumber();
之间没有任何区别。我知道让类名在同一类中调用静态方法似乎是多余的,但是如果我们显式使用类名,是否会出现性能问题或其他问题?相对于ABC.getSomeNumber();
和getSomeNumber();
,在编译时如何解决这些问题?
public class ABC {
public static int getSomeNumber(){
return 10;
}
public static void anotherMethod(){
ABC.getSomeNumber();
getSomeNumber();
}
}
答案 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()
仅在您从类外部调用时使用。