1.不知你问什么。两个对象,两份变量。
2.两个对象,两份函数(除非是static的)。
3.垃圾收集时机是由实现者来调用的,不定时(由算法来决定),除非你自己调用system.gc.

解决方案 »

  1.   

    height,weight都是static的。不管你创建多少个人物,这两个变量都只存一处地方。这里不存在指针问题,也没有指针。speak()有两个,连里面的东西都有两个。至于garbage collector,不好说。不同jvm有不同的机制。一般在发现memory不够的时候,自己(不是你自己哦)去执行,也可以由你自己通过finalize()去建议执行。
      

  2.   

    1. 每次使用new关键字时,jvm就会从内存中一个叫做heap的地方分配出一块内存,并将其地址返回, 并指派给所声明的变量。代码中连续使用了两个new关键字,当然是分配出了两块内存,reference zhubajie 指向一块,而 reference lin 指向另一块。(附:Java中用术语reference 而不用术语“指针”)    2. 程序运行时内存划分为代码区(code area)和数据区(data area),而数据区又分为静态存储区(static area),栈(stack)和堆(heap)。当一个类被载入内存时,它的代码就被放到了代码区,只有一份。而当你调用 new XXX() 产生一个XXX类型的对象时,只从heap上给类中的数据成员(fields)分配空间,而不给类中的成员函数(methods)分配空间。对象里面只包含数据成员,不包含成员函数,你应该把对象和成员函数分开对待,并不是说产生一个对象,就往这个对象里塞入一份成员函数,对象只是和成员函数存在这一种关联而已。至于在调用函数过程当中所涉及的调用栈的问题,并不是三言两语可以说清楚,建议找本编译原理的书看一看,一切自然明朗。    3. 垃圾回收的发生是不确定的,当jvm认为有需要时它才调用垃圾收集器。
    比如,用new XXX()产生一个对象:
        XXX oneObject = new XXX();
    然后将oneObject置空:
        oneObject = null;
    这时,由new XXX()所产生的对象已经没有任何reference指向它了,也就是说它可以被垃圾收集器收集了,但并不保证垃圾收集马上发生,该对象只是符合被收集的条件罢了。
      

  3.   

    hao  ,thanks!and some other question i will ask you.give me seconds to research it.
      

  4.   

    我建议楼主去看看C++代码后的汇编,那样会很清楚的,
    函数只有一份,里面的局部变量是跟堆栈相关的,所以不存在几份的问题
    静态变量跟全局变量一样(java中没有)都是在程序静态区中的,就是说在exe中的一个节里面有空间,只有一份,
    垃圾回收嘛不是我们的事了,它会用很好的算法在我们不需要的时候,系统发觉内存不够的时候收集的,