public class A{ //在栈中创建b引用
//在堆中创建一个B的对象
//b引用指向B对象
private B b = new B();
//在栈中创建c引用
private C c ; public void createC(){ //在堆中创建一个B的对象,
//修改b的引用,使引用指向它
c = new C(); }
public D createD(){ //在栈中创建d引用
//在堆中创建一个D的对象
//d引用指向D对象
D d = new D();
} public static void main(String[] args){
//在栈中创建a引用
//在堆中创建一个A的对象
//a引用指向A对象
A a = new A();
a.createC();
a.createD();
/*
问题?
b与c变量数据全局的,所以会比d存活的久一点
那堆中的B、C、D对象的生命周期一样长吗?
*/ }
解决方案 »
- 引用classpath下面的包错误
- 随机数组中取数
- 找个好心人!
- 实现接口,为什么一定要实现接口中的所有方法
- 开公司,创业,请各位兄弟姐妹给公司赐个名字。
- applet访问本地文件,需要怎样进行授权?谢谢!告诉我去哪里找资料也行!
- 高手请进
- 说说二进制I/O的疑问
- 100分在线等待你的支援!
- 新手请教:我用Jbuilder3编了个Applet(曲线图),用AppletViewer看没问题,可若直接用浏览器看就看不见了,鼠标放在Applet上就提示Load:class XXX not found不知是怎么回事
- 《一道关于继承的面试题,有意思》的疑问?
- String xx = "object"; 生成几个对象??如何验证
我觉得应该是不会的。
垃圾回收在内存不够的情况下会提前启动
检测到B C D三对象的时候。由于B C 的引用属于全局的。所有一般不会立即回收
而d中的就不同。方法 createD执行结束后,d引用失效了。对D对象来说。它已经是个垃圾了
此时会被回收
被一些书给误导了 有些书说 引用就在栈中 对象生成就在堆中 这是片面的
建议楼主可看一下这贴
http://topic.csdn.net/u/20090927/15/e5bcd2aa-a70e-44d6-aa66-1d6d4a8783e1.html
里面讨论了一些 关于JVM stack 和 heap 的机理
垃圾回收机制进行回收时,若对象此时没有被引用,则会将该对象作为垃圾回收 ,具体什么时候回收,则需要看采用的是什么回收机制,总之一个原则:当一个对象变为无用对象时,就随时会被回收.
private C c ; public void createC(){
c = new C();
}
public void createD(){
D d = new D();
}
public void finalize()
{
System.out.println("Finalizing A.");
} public static void main(String[] args){
A a = new A();
a.createC();
a.createD();
while(true)
System.gc();
}
}class B
{
public void finalize()
{
System.out.println("Finalizing B.");
}
}class C
{
public void finalize()
{
System.out.println("Finalizing C.");
}
}class D
{
public void finalize()
{
System.out.println("Finalizing D.");
}
}