test的对象肯定会被生成,因为它的子类的对象都已经生成了.
解决方案 »
- EJB为什么没有被淘汰?
- proguard 混淆器怎么用!请不要复制网上的!
- Netbeans 6.8下关于Hibernate的配置使用
- 求 java递归实现树结构,急,在线等。
- struts 配置路径问题{入门阶段}
- 我是个大专生明年毕业 想报个培训班 以便找个好一点的工作 希望有同样经验的给点意见 和 培训的经历和找工作的经历
- Eclipse 导入MyEclipse web 项目(求指导)
- 问个比较简单的路径问题,初学,望大家指教
- 请教大侠(关于RMIC)
- 有关ejb开发的问题?
- struts
- Java WEB 打印:Struts + JasperReport + iReport + DAO + Hibernate + 存储过程 解决方案!你有好的建议吗?
那么我再改一下class Test{
public Test(){
System.out.println ("Test is live");
}
public void finalize(){
System.out.println ("Test is Dead");
}
}class Test2 extends Test{
public Test2(){
System.out.println ("Test2 is live");
}
public void finalize(){
System.out.println ("Test2 is Dead");
}
}class Test3{
public void finalize(){
System.out.println ("Test3 is Dead");
}
public static void main(String[] args){
Test2 t = new Test2();
Runtime.getRuntime().gc();
t = null;
Runtime.getRuntime().gc();
Test3 t3 = new Test3();
Runtime.getRuntime().gc();
t3 = null;
Runtime.getRuntime().gc();
}
}输出结果Test is live
Test2 is live
Test2 is Dead
Test3 is Deadfinalize() 方法 是 先调用子类的再调用父类的应该 Test2 is Dead 后面就要出现 Test is Dead
但是现在 Test3 的对象已经死亡以后 Test 的对象为什么还没有死亡
难道调用构造函数也可以不生成对象吗???
在这里你首先要明白继承(inheritance)的概念,extends表明要构造的新类是从现有的类衍生出来,也就有了super class(超类) 和 child class(子类),子类拥有超类的所有方法和属性。在构造子类的过程中
先调用超类的构造器(如果没有,就用默认的),再调用自身的构造器。但子类是超类的一种扩展(大多数情况),也可以看做子类是超类的特例,他们是is-a的关系,
白话点就是:程序中的test2就是 test的一种,你说会生成两个对象吗?
从功能上理解:test2拥有了比test更多的功能,还要生成test对象干什么!
class Test2 extends Test{
public Test2(){
System.out.println ("Test2 is live");
}public void finalize(){
System.out.println ("Test2 is Dead");
super.finalize();//要在这里加一句.
}
}
你上面说得对,是先清理子类的对象,再清理父类的.所以要把super.finalize()加到下面!
但是 System.gc();
我不管他在内存哪个部分
他已经变成了垃圾
那么我就可以把他清除
为什么要在子类的析构函数去调用父类的
好象 System.gc(); 看不到他一样
你的test构造器是无参所以会默认的调用否者要用super(..)
我觉得是这样的
如果继承就要生成超类对象,那么继承抽象类呢?
Test2 is live
Test2 is Dead
Test is Dead
Test3 is Dead对了
已经看到了调用他的析构函数
说明对象已经存在 MLXLZC()
有这个对象
public Test(){
System.out.println ("Test is live");
}
public void finalize(){
System.out.println ("Test is Dead");
}
}class Test2 extends Test{
public Test2(){
System.out.println ("Test2 is live");
}
public void finalize(){
System.out.println ("Test2 is Dead");
super.finalize();
}
}class Test3{
public void finalize(){
System.out.println ("Test3 is Dead");
}
public static void main(String[] args){
Test2 t = new Test2();
Runtime.getRuntime().gc();
t = null;
Runtime.getRuntime().gc();
Test3 t3 = new Test3();
Runtime.getRuntime().gc();
t3 = null;
Runtime.getRuntime().gc();
}
}输出结果:
Test is live
Test2 is live
Test2 is Dead
Test is Dead
Test3 is Dead我用了抽象类作为父类
他也生成了对象
但是直接用 new 却不行
也就是说调用父类的构造函数和使用 new 不同
但是为什么我在子类 里面不使用 super.finalize();
用 System.gc();
不能把对象清除????
System.gc()
只会去清除在堆内存里面的对象
使用 new 创建的对象
如果他是在栈内存里面那么现在又不能解释了Test3 t4;
Runtime.getRuntime().gc();把这两句加到 main 函数里面
没有对象
呵呵
我明白
super.finalize()只是调用那个方法
并没有说明是有一个对象存在