在Java虚拟机中调用静态方法

时间:2014-06-21 19:58:31

标签: java methods static

为什么我们不能使用具有相同名称的静态和实例方法? Java如何处理静态方法以及如何通过JVM确定静态方法的调用?

2 个答案:

答案 0 :(得分:2)

static keyword表示类成员。在类中可以有以下类成员

  1. 静态数据成员
  2. 静态阻止
  3. 静态方法。
  4. 实例成员表示单个对象的属性和行为,而类成员表示类的属性行为。

    回答你的问题,静态方法不是这种情况,你定义的任何方法是静态的还是实例的,你不能初始化另一个同名的方法。 在java中,任何静态数据成员和静态方法都在类或方法区域中加载。

    在加载课程后,执行以下说明

    1. 静态数据成员(如果定义)在类区域中创建。
    2. 执行static bloc(如果定义)。
    3. 使用类的名称调用任何静态数据成员或方法(表示类行为)。

      classname.Methodname(arguments if any)
      

      类成员对所有对象都是通用的,因此它们可用于类的对象:也可以调用为: -

      objectrefrence.methodname(arguments if any)
      

答案 1 :(得分:2)

JVM spec

  

2.10.2方法签名

     

方法的签名包括方法的名称以及方法的形式参数的数量和类型(第2.10.1节)。类不能声明具有相同签名的两个方法。

请注意,修饰符(publicstatic等)不是JVM用于查找方法的签名的一部分。

有分别用于调用static和非static方法的不同字节码指令:invokestaticinvokevirtual,但两者都希望方法签名能够识别要调用的方法

有可能更改字节码规范,以便 invokestatic 查找具有给定签名和static修饰符的方法,但这需要更改Java反射的工作方式,并打破了很多现有的代码。它也可能会破坏invokedynamic等新的调用机制。