如果类中包含类成员,则系统只在实例化该类的第一个对象的时候,为类成员分配内存,以后再生成该类的实例对象时,将不再为类成员分配内存,不同对象的类变量将共享同一内存空间。类变量的内存空间是在类定义时就已经分配,因此引用这一变量时无须生成该类的对象
教材中的这两段话我觉得有些矛盾啊,类变量的内存空间到底是在什么时候分配的啊?谢谢大家帮我解释一下。
教材中的这两段话我觉得有些矛盾啊,类变量的内存空间到底是在什么时候分配的啊?谢谢大家帮我解释一下。
public static void main(String[] args) {
new Test();
new Test();
}
}class Test {
Organization org = new Organization();
Test() {
System.out.println(org);
}
}
class Organization {
}
输出结果为:
nichao.Organization@6b97fd
nichao.Organization@1c78e57说明2次实例化Test,为其中的类成员变量分配不同的内存地址~~
楼主主要是觉得“系统只在实例化该类的第一个对象的时候,为类成员分配内存”和“类变量的内存空间是在类定义时就已经分配”这两段互相矛盾吧?确实,我觉得这两种说法都不是很正确哦,正确的说法应该是“类变量的内存空间是在类加载时分配”,类加载总是在“实例化该类的第一个对象”之前发生的,而且可以仅加载类,而不实例化任何对象(用Class.forName()方法实现)。
第二句话指的是静态变量,即是用static定义的,可以直接调用.
public static int i;
private int b;
public void test(){
i=5;//这是错误的,在类加载是I=0;只有在构造器可以改变
b=5;//这是正确的
}
public A(){
i=2;
}
}