class B{
int a,b;
public void finalize()
{ System.out.println("object is going!"); }public static void main(String[] args)

  new B();  //<<==如果改成了B b=new B();运行的时候可以通过,但什么都不显示了!
  System.gc(); //启动垃圾回收
}
}
我想问下各位大哥,new B和B b=new B()到底有什么区别,new B()是什么用的,讲详细点啊,我笨,谢谢!

解决方案 »

  1.   

    B b=new B();//new出一块B内存给b,
    而new B();是new出一块内存,但没有做什么!所以可以把它看成是垃圾!
      

  2.   

    B b=new B();
    b.finalize();
    应该可以输出那串字符吧
      

  3.   

    wowo05,你讲的不太对啊,用new B()的话,运行会显示object is going!的,如果用B b=new B();的话就不显示,怎么回事啊
    2楼的那个方法我会,就是不懂new B()和B b=new B()的区别,大哥给我讲讲吧!
      

  4.   

    new B()  是开辟一个内存单元
    B b = new B()是用b指向你开辟的内存单元,方便你使用
      

  5.   

    厄....我很笨的,xichao0075210,能不能举个例子讲明白点
    我不懂的就是,为什么new B()运行的时候可以显示object is going!,而B b=new B()不可以呢
      

  6.   

    简单解释:String str = new String("Java");str是个对象变量。可以也只可以存放String类型的引用。
    对象都是在堆中构造的。
    String("Java");是调用constructor初始化对象,构造一个对象实例。
    new 是动态为对象分配个地址,他的返回值是个引用(也就是个指针)赋给对象变量str。
      

  7.   

    B b=new B()的时候,b始终指向一个B的实例,所以,即使用了System.gc(); 系统始终认为b所指向的B的实例还会用到还不能回收,及不会运行finalize(),但new B()的时候并没有创建一个变量指向B的实例,所以系统认为他可以回收了,就运行了finalize()啰
      

  8.   

    你象这样应该就可以显示那行字
    B b=new B();
    b=null;
    System.gc();
      

  9.   

    如果你写成:new B(); 
    System.gc(); 因为new出来的这个对象不存在任何引用,执行System.gc()时,系统马上识别出New出来的这个对象是个垃圾,所以会立即回收=====================================================================但如果你写成:B b=new B();
    System.gc(); 执行System.gc()时,b这个变量的作用域还没有消失,也就是说New出来的这个对象还在被b所引用,所以不会被回收
      

  10.   

    这个...有点懂了,不过我还是想问下:到底是  "什么"  让finalize()执行的,为什么new B()可以,而B b=new B()不可以呢
      

  11.   

    在java中没有被引用的对象都被作为垃圾,被GC(垃圾收集机制)收集。
    所以new B();实际上一出来就是垃圾。因为没有引用,所以程序根本无法用它。
    当垃圾回收器将要释放一个对象的内存时,它调用该对象的finalize() 方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。(事实上,你可以调用System.gc() 方法强制垃圾回收器来释放这些对象的内存。)
      

  12.   

    楼上的大哥,我又把我的代码加了几句话:
    class B{
    int a,b;
    public void finalize()
    { System.out.println("object is going!"); }
    int sum(){
      a=3;
      b=4;
      return a+b;}
    void print(){
      System.out.print(this.sum());}
    public static void main(String[] args)
    { new B();
      System.gc(); //启动垃圾回收
    }
    }
    为什么运行了就只显示finalize()方法,而不显示其他的方法呢,郁闷!不是说只要该对象定义了此方法,他就会调用该方法了吗
      

  13.   

    不是说只要该对象定义了此方法,他就会调用该方法了吗
    ================================================
    我汗~你从哪里看来的?你是想问为什么没有显示a+b的值是吧?你上面那段程序里面,main方法中我没有看到任何代码调用了print(),又怎么会显示你想看到的东西呢?PS:我觉得你有些基本的模仿还没有弄清楚,这样子你写的代码就总是问题多多
      

  14.   

    bapi(扒皮):你说的那个调用我会,我只是想问,finalize()这个我也没用对象啊,为什么他就可以调用呢,而print()却不可以呢
      

  15.   

    finalize()会被垃圾收集器自动调用,就是说System.gc()这句代码就等同于调用了finalize(),就好比new一个对象的时候,对应的构造方法会被自动调用一样,这是由JVM决定的但是你写的print()不会被JVM自动调用,只能你自己在代码中显试调用
      

  16.   

    后来我又把finalize()的方法名给换了,结果就不显示了!!是不是finalize()在系统中已经被定义了,所以system.gc()就等于他了呢,那还有什么语句是可以这样的呢
      

  17.   

    jefyjiang(天下) ( ) 信誉:100    Blog  2007-3-23 23:13:45  得分: 0  
     
     
       
    你象这样应该就可以显示那行字
    B b=new B();
    b=null;
    System.gc();
    ______________________
    正解~
      
     
      

  18.   

    呵呵,刚发现一个好的学习网站,还有视频教程下载,希望能对大家有所帮助:
    c语言学习交流站 http://blog.sina.com.cn/dengweiwei
    c语言学习交流站 http://blog.sina.com.cn/dengweiwei
    c语言学习交流站 http://blog.sina.com.cn/dengweiwei
    c语言学习交流站 http://blog.sina.com.cn/dengweiwei
    c语言学习交流站 http://blog.sina.com.cn/dengweiwei
      

  19.   

    jdk中的说明:
    protected void finalize() throws Throwable {}every class inherits the finalize() method from java.lang.Object 
    the method is called by the garbage collector when it determines no more references to the object exist 
    the Object finalize method performs no actions but it may be overridden by any class 
    normally it should be overridden to clean-up non-Java resources ie closing a file 
    if overridding finalize() it is good programming practice to use a try-catch-finally statement and to always call super.finalize() (JPL pg 47-48). This is a saftey measure to ensure you do not inadvertently miss closing a resource used by the objects calling class 
    protected void finalize() throws Throwable {
        try {
            close();        // close open files
        } finally {
            super.finalize();
        }
    }any exception thrown by finalize() during garbage collection halts the finalization but is otherwise ignored 
    finalize() is never run more than once on any object 
      

  20.   

    中文jdk:
    protected void finalize()  throws Throwable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
     
    finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。 Object 类的 finalize 方法执行非特殊性操作;它仅执行一些常规返回。Object 的子类可以重写此定义。 Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。 在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。 对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。 finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。---------------
    楼主遇到这些问题的时候,可以先查看jdk文档。 
      

  21.   

    nirvana_li(东成西就,芝兰境界) :太感谢你了!!受教了