test的对象肯定会被生成,因为它的子类的对象都已经生成了.

解决方案 »

  1.   

    这里还是不太明显
    那么我再改一下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 的对象为什么还没有死亡
    难道调用构造函数也可以不生成对象吗???
      

  2.   

    第一次回答问题,可能不很准确。
    在这里你首先要明白继承(inheritance)的概念,extends表明要构造的新类是从现有的类衍生出来,也就有了super class(超类) 和 child class(子类),子类拥有超类的所有方法和属性。在构造子类的过程中
    先调用超类的构造器(如果没有,就用默认的),再调用自身的构造器。但子类是超类的一种扩展(大多数情况),也可以看做子类是超类的特例,他们是is-a的关系,
    白话点就是:程序中的test2就是 test的一种,你说会生成两个对象吗?
    从功能上理解:test2拥有了比test更多的功能,还要生成test对象干什么!
      

  3.   

    这里有错,我改了一下.
    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()加到下面!
      

  4.   

    所有新建的对象是在 堆内存里面
    但是 System.gc();
    我不管他在内存哪个部分
    他已经变成了垃圾
    那么我就可以把他清除
    为什么要在子类的析构函数去调用父类的
    好象 System.gc(); 看不到他一样
      

  5.   

    我是说不会生成test对象
    你的test构造器是无参所以会默认的调用否者要用super(..)
    我觉得是这样的
    如果继承就要生成超类对象,那么继承抽象类呢?
      

  6.   

    interhanchi(路曼曼其修远兮,吾将上下而求索.) Test is live
    Test2 is live
    Test2 is Dead
    Test is Dead
    Test3 is Dead对了
    已经看到了调用他的析构函数
    说明对象已经存在 MLXLZC() 
    有这个对象
      

  7.   

    abstract 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");
    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();
    不能把对象清除????
      

  8.   

    我想我明白了一点了
    System.gc()
    只会去清除在堆内存里面的对象
    使用 new 创建的对象
    如果他是在栈内存里面那么现在又不能解释了Test3 t4;
    Runtime.getRuntime().gc();把这两句加到 main 函数里面
    没有对象
    呵呵
      

  9.   


    我明白
    super.finalize()只是调用那个方法
    并没有说明是有一个对象存在
      

  10.   

    我觉得只要子类的对象产生了,那么父类的对象肯定会被产生,但是你承认不承认它那是另一回事了.另外,关于finalize,java和c++不一样,c++中对象被执行delete的时候,肯定会执行析构函数,但是java,没有任何东西可以保证finalize一定会被执行.
      

  11.   

    而且,你主动调用gc,没有任何东西保证gc一定会在你调用的时候发生,甚至不能保证在你程序结束前发生.