help 构造函数问题,难度大

yanghongjy 2005-08-06 03:55:08
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");
}

public static void main(String[] args){
Test2 t = new Test2();
Runtime.getRuntime().gc();
t = null;
Runtime.getRuntime().gc();
}
}

Test is live
Test2 is live
Test2 is Dead

为什么 Test 的构造函数被调用了
但是没有生成 Test 的对象
...全文
331 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenpipi 2005-08-06
  • 打赏
  • 举报
回复
而且,你主动调用gc,没有任何东西保证gc一定会在你调用的时候发生,甚至不能保证在你程序结束前发生.
shenpipi 2005-08-06
  • 打赏
  • 举报
回复
我觉得只要子类的对象产生了,那么父类的对象肯定会被产生,但是你承认不承认它那是另一回事了.另外,关于finalize,java和c++不一样,c++中对象被执行delete的时候,肯定会执行析构函数,但是java,没有任何东西可以保证finalize一定会被执行.
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
调用构造函数并不一定会生成一个对象
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复

我明白
super.finalize()只是调用那个方法
并没有说明是有一个对象存在
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
我想我明白了一点了
System.gc()
只会去清除在堆内存里面的对象
使用 new 创建的对象
如果他是在栈内存里面那么现在又不能解释了

Test3 t4;
Runtime.getRuntime().gc();

把这两句加到 main 函数里面
没有对象
呵呵
interhanchi 2005-08-06
  • 打赏
  • 举报
回复
并没有生成父类的对象,它怎么会清理.它只是调用父类的构造器,调用父类的构造器是为了对父类的元素进行初始化!
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
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();
不能把对象清除????
MLXLZC 2005-08-06
  • 打赏
  • 举报
回复

谢谢
我记得C++是有的,但我从抽象类的角度去理解的,这方面我会去留意的。
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
interhanchi(路曼曼其修远兮,吾将上下而求索.)

Test is live
Test2 is live
Test2 is Dead
Test is Dead
Test3 is Dead

对了
已经看到了调用他的析构函数
说明对象已经存在

MLXLZC()
有这个对象
MLXLZC 2005-08-06
  • 打赏
  • 举报
回复
我是说不会生成test对象
你的test构造器是无参所以会默认的调用否者要用super(..)
我觉得是这样的
如果继承就要生成超类对象,那么继承抽象类呢?
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
所有新建的对象是在 堆内存里面
但是 System.gc();
我不管他在内存哪个部分
他已经变成了垃圾
那么我就可以把他清除
为什么要在子类的析构函数去调用父类的
好象 System.gc(); 看不到他一样
interhanchi 2005-08-06
  • 打赏
  • 举报
回复
这里有错,我改了一下.
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()加到下面!
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
是的
你已经意识到了问题
我是说调用了构造函数那么是否就生成了对象
如果生成了
为什么我调用垃圾处理程序不能把他清除?
MLXLZC 2005-08-06
  • 打赏
  • 举报
回复
子类拥有超类的属性
如果不调用构造器
怎么初始化
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
但是他调用了构造函数
MLXLZC 2005-08-06
  • 打赏
  • 举报
回复
第一次回答问题,可能不很准确。
在这里你首先要明白继承(inheritance)的概念,extends表明要构造的新类是从现有的类衍生出来,也就有了super class(超类) 和 child class(子类),子类拥有超类的所有方法和属性。在构造子类的过程中
先调用超类的构造器(如果没有,就用默认的),再调用自身的构造器。但子类是超类的一种扩展(大多数情况),也可以看做子类是超类的特例,他们是is-a的关系,
白话点就是:程序中的test2就是 test的一种,你说会生成两个对象吗?
从功能上理解:test2拥有了比test更多的功能,还要生成test对象干什么!
yanghongjy 2005-08-06
  • 打赏
  • 举报
回复
这里还是不太明显
那么我再改一下

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 Dead

finalize() 方法 是 先调用子类的再调用父类的

应该 Test2 is Dead 后面就要出现 Test is Dead
但是现在 Test3 的对象已经死亡以后 Test 的对象为什么还没有死亡
难道调用构造函数也可以不生成对象吗???
shenpipi 2005-08-06
  • 打赏
  • 举报
回复
test的对象肯定会被生成,因为它的子类的对象都已经生成了.

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧