Java 对静态方法的这两个调用之间有什么区别吗?
在下面的代码中,Java 对静态方法的这两个调用之间有什么区别吗?,java,static,Java,Static,在下面的代码中,ABC.getSomeNumber()之间有什么区别吗和getSomeNumber()。我理解在同一个类中使用类名来调用静态方法似乎是多余的,但是如果我们显式地使用类名,是否存在任何性能问题或其他问题?在编译时如何解决这些问题vsgetSomeNumber() 不,没有区别ClassName.methodName()仅在从类外部调用时使用。没有区别ClassName.methodName()仅在从类外部调用时使用。在这种情况下没有区别 如果从其他类(直接或通过静态导入)调用,则需
ABC.getSomeNumber()之间有什么区别吗代码>和getSomeNumber()代码>。我理解在同一个类中使用类名来调用静态方法似乎是多余的,但是如果我们显式地使用类名,是否存在任何性能问题或其他问题?在编译时如何解决这些问题
vsgetSomeNumber()代码>
不,没有区别ClassName.methodName()
仅在从类外部调用时使用。没有区别ClassName.methodName()
仅在从类外部调用时使用。在这种情况下没有区别
如果从其他类(直接或通过静态导入)调用,则需要该名称
您可以在同一个类中使用任意一种形式。这实际上取决于偏好。如果您从许多类中调用类似命名的方法,您可以选择显式使用类名,因为这将帮助您在阅读时消除歧义
对性能没有影响,因为它们在编译后会变得相同。在这种情况下没有区别
如果从其他类(直接或通过静态导入)调用,则需要该名称
您可以在同一个类中使用任意一种形式。这实际上取决于偏好。如果您从许多类中调用类似命名的方法,您可以选择显式使用类名,因为这将帮助您在阅读时消除歧义
这对性能没有影响,因为它们在编译后会变得相同。让我们看看字节码是否存在差异:
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
}
从“ABC.java”编译而来
公共课操场{
公共游乐场;
代码:
0:aload_0
1:invokespecial#8//方法java/lang/Object。“:()V
4:返回
公共静态int getSomeNumber();
代码:
0:bipush 10
2:我轮到你了
公共静态无效anotherMethod();
代码:
0:invokestatic#17//方法getSomeNumber:()I
3:流行音乐
4:invokestatic#17//方法getSomeNumber:()I
7:流行音乐
8:返回
}
invokestatic的
表示:参数
(…)用于构造索引
进入当前类的运行时常量池。(…)该索引处的运行时常量池项必须是符号
对方法或接口方法(…)的引用,其中
方法的名称(…)以及
方法所在的类或接口的符号引用
有待发现。已解析命名的方法
这两个调用都以相同的方式引用常量池的同一项(#17
)。静态本地方法getSomeNumber
被称为合格还是不合格,字节码之间没有区别。让我们看看字节码是否有区别:
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
}
从“ABC.java”编译而来
公共课操场{
公共游乐场;
代码:
0:aload_0
1:invokespecial#8//方法java/lang/Object。“:()V
4:返回
公共静态int getSomeNumber();
代码:
0:bipush 10
2:我轮到你了
公共静态无效anotherMethod();
代码:
0:invokestatic#17//方法getSomeNumber:()I
3:流行音乐
4:invokestatic#17//方法getSomeNumber:()I
7:流行音乐
8:返回
}
invokestatic的
表示:参数
(…)用于构造索引
进入当前类的运行时常量池。(…)该索引处的运行时常量池项必须是符号
对方法或接口方法(…)的引用,其中
方法的名称(…)以及
方法所在的类或接口的符号引用
有待发现。已解析命名的方法
这两个调用都以相同的方式引用常量池的同一项(#17
)。静态本地方法getSomeNumber
被称为合格还是不合格在字节码中没有区别