何时为Java中的静态方法创建内存

时间:2013-08-17 19:05:04

标签: java memory-management

我有两个A和B类.A类有主要方法,B类有两个方法,AddSub

我的问题是,何时为B类分配了内存?

在线号。 2或8;当我导入课程或我打电话给班级时?

如果内存分配在第no行。 2.在第号行。 3我已导入java.util。*,因此将为util包中的所有类分配对象。

如果内存分配在第no行。那么子方法怎么样?

A类

   1 package sample;
   2 import sample1.B;
   3 import java.util.*;
   4 public class A 
   5 {
   6    public static void main(String args[])
   7    {
   8        B.Add(3, 3);
   9    }
   10 }

B类

package sample1;
public class B 
{
    public static int Add(int A,int B)
    {
        return A+B;
    }
    public static int sub(int A,int B)
    {
        return A-B;
    }
}

2 个答案:

答案 0 :(得分:5)

第二行不是转换为JVM字节码指令的代码。它只是编译器的一个声明,可以帮助它解决简单的名称。

第8行之前的最新可能的时刻ClassLoader B将运行,而静态初始值设定项(如果有) B会运行。然而,执行ClassLoader B可以更早出现。 specification仅保证Class对象将被加载一次且不晚于第一次使用之前,并且静态初始化器将只运行一次而立即在需要它们的第一时刻之前。

  

在第3行,我导入了java.util。*,因此将为util包中的所有类分配对象。

不,再次,import声明转换为JVM字节码指令。它不会导致在运行时创建或加载任何对象。它只是 编译器用来解析简单名称的声明。这样您就可以说Set而不是java.util.Set

  

如果内存是在第8行分配的,那么sub方法呢?

ClassLoader的{​​{1}}和B的静态初始值设定项将在第8行执行之前运行,它们将如果您调用类B的任何其他静态成员,请再次运行。

答案 1 :(得分:0)

在加载类时,为分配内存(用于静态和各种控制信息)。

在创建实例时(即new)为实例分配内存。

调用方法时,为方法分配内存。 (并且该方法是静态方法还是实例方法无关紧要。)