一般在C++的学习过程中,学习到static成员的时候,都会举统计对象个数的例子,在Java中也可以用同样的实现方法。比如,学生类Student,其中添加代码:
class Student{
    public static int num;
    public Student(){
        num++;
    }
}这样每次new一个Student的时候都可以给num加1,从而实现对象的计数。但由于java中没有析构方法,所以无法析构,从而导致num无法减1。java中虽然提供了finalize方法,但是该方法未必会被调用,这样可能无法满足要求。现在的要求是:当一个Student对象没有用的时候,需要释放其内存,并将num减1,那么该如何实现呢?

解决方案 »

  1.   

    上面也没有用到析构方法啊, public Student(){
            num++;
        }
    只是个构造函数,如果用num来计算,上面这段代码也可以一定意义上计算个数。但是真没有听过java可以计算对象的个数,希望高手来解答,关注
      

  2.   

    恩  Java中的垃圾回收是不确定的  不要企图搞它了  呵呵  而且这样有什么意义吗?
      

  3.   

    public class T {
    private static int i = 0; public T() {
    i++;
    } public static int getNumber() {
    return i;
    } public static void main(String[] args) {
    T t1 = new T();
    T t2 = new T();
    T t3 = new T();
    T t4 = new T();
    System.out.println("一共创建了" + T.getNumber() + "个对象");
    }
    }
      

  4.   

    Java中也可以统计当前类所生成的对象的个数,如上所写
      

  5.   

    如果這樣算的話,那麼應該只能在finalize()里搞減一了,當對象沒有被引用時,垃圾回收時會清除該對象,該對象finalize()會被調用,那樣的話,只要你想清除的對象沒有被引用,那麼再調用System.gc()應該可以的
      

  6.   

    哈哈 请不要忘了jdk的自带功能 ! 其实你要统计一个类或一个容器或一个应用中内存,类的加载数量,和一些其它统计信息,可以使用jconsole还提供远程监控的功能。
    在jdk的安装目录下找到bin然后打开jconsole.exe
    关于jconsole的使用网上有很多资料我就不在这里啰嗦了楼主搜一下就可以了
    希望能帮到你
      

  7.   


    用System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行
    所以回收的对象是没办法控制的。
      

  8.   

    你所说的内容还是仅仅在增加的时候计算了对象的个数,我关心的是在对象需要减少的时候怎么办。比如,在一个学生信息系统中,一个学生退学了,这个时候应该删除该对象,哪怕内存中不删除,但是对象的个数,即num是应该减1的。当然,一般的学生信息系统不会这样来统计对象个数,但现在仅仅是为了解决这个问题,即,num如何在适当的时候减1的问题。
      

  9.   

    你所说的内容还是仅仅在增加的时候计算了对象的个数,我关心的是在对象需要减少的时候怎么办。比如,在一个学生信息系统中,一个学生退学了,这个时候应该删除该对象,哪怕内存中不删除,但是对象的个数,即num是应该减1的。当然,一般的学生信息系统不会这样来统计对象个数,但现在仅仅是为了解决这个问题,即,num如何在适当的时候减1的问题。
      

  10.   

    你所说的内容还是仅仅在增加的时候计算了对象的个数,我关心的是在对象需要减少的时候怎么办。比如,在一个学生信息系统中,一个学生退学了,这个时候应该删除该对象,哪怕内存中不删除,但是对象的个数,即num是应该减1的。当然,一般的学生信息系统不会这样来统计对象个数,但现在仅仅是为了解决这个问题,即,num如何在适当的时候减1的问题。
      

  11.   

    是啊,加1的时候是自动的,因为new的时候调用了构造方法,而释放的时候怎么办?在哪里调用14楼所说的静态方法呢?
      

  12.   

    静态方法的办法如下public class T {
        private static int i = 0;    public T() {
            i++;
        }    public static int getNumber() {
            return i;
        }    public static void function(){
            i--;
      }    public static void main(String[] args) {
            T t1 = new T();
            T t2 = new T();
            T t3 = new T();
            T t4 = new T();
            System.out.println("一共创建了" + T.getNumber() + "个对象");
            t1=null;
            T.function();
            t2=null;
            T.function();
              ....
              ....
        }
    }
       
    }
      

  13.   

    19楼的办法行吗?t1=null时对象回不回收并不确定,而这是调用function方法进行--操作,是不是不合理?有人解释下吗?
      

  14.   


    要想确定回收还不简单,直接在t1=null 后面加个System.gc();
      

  15.   

    加一个方法
    public deleteStudent(Student student){
     num--;
     student = null;
    }
    在程序中控制调用这个方法就行啦
      

  16.   

    这就是你business的问题了,所谓的适当时候就是学生退学的时候,你在退学的方法最后把num减一不就行了么?
      

  17.   

    估计LZ实际中的问题就是11楼LZ写的那些。答案同上。