我有两个A和B类.A类有主要方法,B类有两个方法,Add
和Sub
。
我的问题是,何时为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;
}
}
答案 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
)为实例分配内存。
调用方法时,为方法分配内存。 (并且该方法是静态方法还是实例方法无关紧要。)