| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 756 人关注过本帖
标题:关于String类问题?(已解决但是String新问题出来了)
只看楼主 加入收藏
he20041987
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2007-9-10
结帖率:100%
收藏
 问题点数:0 回复次数:8 
关于String类问题?(已解决但是String新问题出来了)
String str=new String("aaa");
str="bbb";

这个有几个对象,产生了几个垃圾内存  我自己觉得是三个对象,两个垃圾内存。但下面的程序有不理解了
代码如下:

class StringTest{

    public void finalize(){
        System.out.print("清理垃圾。");
    }
    public static void main(String[] args){
        StringTest a=new StringTest();
        String str1="123";
        String str2=new String("123");
        str1="2";

        new StringTest();//测试finalize()是可以被调用的。
        System.gc();
    }
}
但为什么finalize()只被调用一次呢

[[it] 本帖最后由 he20041987 于 2008-4-6 11:04 编辑 [/it]]
搜索更多相关主题的帖子: String 内存 new finalize 
2008-04-05 15:17
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
class StringTest{

    public void finalize(){
        System.out.print("清理垃圾。");
    }
    public static void main(String[] args){
        new StringTest();
        String str1="123";
        String str2=new String("123");
        str1="2";

        new StringTest();
        System.gc();
    }
}
//这样就有2个了
/*
public static void gc()
Runs the garbage collector.
Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.

The call System.gc() is effectively equivalent to the call:

 Runtime.getRuntime().gc()

protected void finalize()
                 throws Throwable
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup.
*/

[[it] 本帖最后由 sunkaidong 于 2008-4-5 16:19 编辑 [/it]]

学习需要安静。。海盗要重新来过。。
2008-04-05 16:12
he20041987
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2007-9-10
收藏
得分:0 
不是这样啊 我问的是String这个类
String str1 = new String("abc"); //jvm 在堆上创建一个String对象   
   
 //jvm 在strings pool中找不到值为“abc”的字符串,因此   
 //在堆上创建一个String对象,并将该对象的引用加入至strings pool中   
 //此时堆上有两个String对象
2008-04-05 16:39
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
每个类要有自己的finalize().只有这样的时候当声明没被引用的时候System.gc();才会找到相应的finalize(),做最后的处理
import java.lang.*;
class string{
        private String s;
        public string(String s1){
            s=new String(s1);
            }
        public void finalize(){
        System.out.print("清理垃圾"+s);
    }
    }
class StringTest{

    public void finalize(){
        System.out.print("清理垃圾。");
    }
    public static void main(String[] args){
        new StringTest();
        string str1=new string("123");
        string str2=new string("123");
        str1=new string("1234");

        new StringTest();
        System.gc();
    }
}

[[it] 本帖最后由 sunkaidong 于 2008-4-5 17:26 编辑 [/it]]

学习需要安静。。海盗要重新来过。。
2008-04-05 17:24
he20041987
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2007-9-10
收藏
得分:0 
还是不太懂! 能不能在我写的那个类中改?这样改了好像意义不一样啊
2008-04-05 17:47
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
不好弄String 是final 是不好继承的..它自己没有finalize()所以没办法在清理的时候调用finalize().其实已经能说明问题了

学习需要安静。。海盗要重新来过。。
2008-04-05 17:54
he20041987
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2007-9-10
收藏
得分:0 
哦 这样啊! 谢谢了
2008-04-05 18:16
谁与争疯
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:海南省
等 级:版主
威 望:191
帖 子:15071
专家分:17513
注 册:2007-4-22
收藏
得分:0 
大佬,解释的时候能不用英文不?

论坛是我家灌水靠大家
2008-04-05 19:16
◎剑魔◎
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-3-31
收藏
得分:0 
强 太强了!
2008-04-05 19:32
快速回复:关于String类问题?(已解决但是String新问题出来了)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022069 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved