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()是什么用的,讲详细点啊,我笨,谢谢!
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()是什么用的,讲详细点啊,我笨,谢谢!
而new B();是new出一块内存,但没有做什么!所以可以把它看成是垃圾!
b.finalize();
应该可以输出那串字符吧
2楼的那个方法我会,就是不懂new B()和B b=new B()的区别,大哥给我讲讲吧!
B b = new B()是用b指向你开辟的内存单元,方便你使用
我不懂的就是,为什么new B()运行的时候可以显示object is going!,而B b=new B()不可以呢
对象都是在堆中构造的。
String("Java");是调用constructor初始化对象,构造一个对象实例。
new 是动态为对象分配个地址,他的返回值是个引用(也就是个指针)赋给对象变量str。
B b=new B();
b=null;
System.gc();
System.gc(); 因为new出来的这个对象不存在任何引用,执行System.gc()时,系统马上识别出New出来的这个对象是个垃圾,所以会立即回收=====================================================================但如果你写成:B b=new B();
System.gc(); 执行System.gc()时,b这个变量的作用域还没有消失,也就是说New出来的这个对象还在被b所引用,所以不会被回收
所以new B();实际上一出来就是垃圾。因为没有引用,所以程序根本无法用它。
当垃圾回收器将要释放一个对象的内存时,它调用该对象的finalize() 方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。(事实上,你可以调用System.gc() 方法强制垃圾回收器来释放这些对象的内存。)
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()方法,而不显示其他的方法呢,郁闷!不是说只要该对象定义了此方法,他就会调用该方法了吗
================================================
我汗~你从哪里看来的?你是想问为什么没有显示a+b的值是吧?你上面那段程序里面,main方法中我没有看到任何代码调用了print(),又怎么会显示你想看到的东西呢?PS:我觉得你有些基本的模仿还没有弄清楚,这样子你写的代码就总是问题多多
你象这样应该就可以显示那行字
B b=new B();
b=null;
System.gc();
______________________
正解~
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
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
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文档。