静态方法如何运行?

时间:2015-05-14 06:50:10

标签: java

静态方法如何在Java中实际运行?我们通常使用类名来调用它们,并且不为它们创建任何对象,但是这些对象实际上可以"运行"而不是方法!

2 个答案:

答案 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,对象或类将它们作为属性保存。