静态方法如何在Java中实际运行?我们通常使用类名来调用它们,并且不为它们创建任何对象,但是这些对象实际上可以"运行"而不是方法!
答案 0 :(得分:4)
对于静态方法,特殊关键字 available 并作为字节代码的一部分添加。它被称为invokestatic
。
来自Oracle docs:
<强> invokestatic 强>
<强>操作强>
调用类(静态)方法
说明:
unsigned indexbyte1和indexbyte2用于构造索引 进入当前类的运行时常量池(§2.6),其中 索引的值是(indexbyte1&lt;&lt; 8)| indexbyte2。运行时 该索引处的常量池项必须是对a的符号引用 方法(第5.1节),它给出了名称和描述符(第4.3.3节) 方法以及对其中类的符号引用 方法是找到的。已解决指定的方法(第5.4.3.3节)。该 已解决的方法不能是实例初始化方法(§2.9) 或者类或接口初始化方法(第2.9节)。肯定是 静态,因此不能抽象。
成功解析方法后,声明了该类的类 如果该类尚未初始化,则初始化已解决的方法(第5.5节) 已初始化。
操作数堆栈必须包含nargs参数值,其中 数值,类型和值的顺序必须与 解析方法的描述符。
示例代码:
public class Example {
static void myStaticMethod() {
System.out.println("Hello");
}
public static void main(String[] args) {
myStaticMethod();
}
}
字节代码:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=0, locals=1, args_size=1
0: invokestatic #31 // Method myStaticMethod:()V
3: return
LineNumberTable:
line 8: 0
line 9: 3
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 args [Ljava/lang/String;
类的运行时常量池:
...
#31 = Methodref #1.#32 // Example.myStaticMethod:()V
...
答案 1 :(得分:1)
如果static method
Java在加载类时加载方法并且也与所有对象共享方法,那就是不需要对象的原因。
为了运行方法,并不总是需要一个对象。
并且不,这不是object
运行的。它是执行操作的method
,对象或类将它们作为属性保存。