1

我有两个类 A 和 B。A 类有 main 方法,B 类有两个方法,AddSub.

我的问题是,什么时候为 B 类分配内存?

在线号。2个或8个;当我导入类或调用类时?

如果内存是在第 1 行分配的。2. 在行号。3 我已经导入了 java.util.* 所以对象将被分配给 util 包中的所有类。

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

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;
    }
}
4

2 回答 2

5

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

紧接在第 8 行之前是for将运行并且静态初始化程序(如果有)将运行的最新可能时刻。但是,for 的执行可能会更早发生。该规范仅保证一个对象将被加载一次且仅一次且不迟于其第一次使用之前,并且静态初始化程序将运行一次且仅一次并且紧接在需要它们的第一个时刻之前。ClassLoaderBBClassLoaderBClass

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

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

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

ClassLoaderforB和静态初始化器 forB将在执行第八行之前运行,如果您调用 class 的任何其他静态成员,它们将不会B再次运行。

于 2013-08-17T19:16:53.737 回答
1

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

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

调用方法时为方法分配内存。(并且方法是静态方法还是实例方法都没有关系。)

于 2013-08-17T22:13:20.837 回答