如果类中包含类成员,则系统只在实例化该类的第一个对象的时候,为类成员分配内存,以后再生成该类的实例对象时,将不再为类成员分配内存,不同对象的类变量将共享同一内存空间。类变量的内存空间是在类定义时就已经分配,因此引用这一变量时无须生成该类的对象
教材中的这两段话我觉得有些矛盾啊,类变量的内存空间到底是在什么时候分配的啊?谢谢大家帮我解释一下。

解决方案 »

  1.   

    public class TestSwing {

    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,为其中的类成员变量分配不同的内存地址~~
      

  2.   

    我觉得“类变量”这个术语应该叫作“静态变量”,指得是static修饰的变量。所以1楼的例子举的不是“类变量”。
    楼主主要是觉得“系统只在实例化该类的第一个对象的时候,为类成员分配内存”和“类变量的内存空间是在类定义时就已经分配”这两段互相矛盾吧?确实,我觉得这两种说法都不是很正确哦,正确的说法应该是“类变量的内存空间是在类加载时分配”,类加载总是在“实例化该类的第一个对象”之前发生的,而且可以仅加载类,而不实例化任何对象(用Class.forName()方法实现)。
      

  3.   

    第一句话指的是实例变量,必须在实例化以后才能调用;
    第二句话指的是静态变量,即是用static定义的,可以直接调用.
      

  4.   

    class A{
    public static int i;
    private int b;
    public void test(){
    i=5;//这是错误的,在类加载是I=0;只有在构造器可以改变
    b=5;//这是正确的
    }
    public A(){
    i=2;
    }
    }