返回信息流突然间有这样一个想法:有一个父亲,有一个儿子,儿子必须继承父亲,然后父亲有一个属性就是他的儿子(来指明他的儿子是谁),儿子有一个属性就是父亲(来指明它的父亲是谁),并且儿子一出生就应该有了父亲属性,假设父亲一出生也有了儿子属性。代码实现这两个类。
如果不用除了构造函数以外的方法,能不能实现之?
于是我动手写了下:
class Father
{
static int count = 0;
Son son;
//第二种,编译通过,运行出错
public Father()
{
this.son =new Son(this);
count++;
}
}
class Son extends Father
{
static int count = 0;
Father father;
public Son(Father father)
{
this.father = father;
count++;
}
}
class Demo
{
public static void main (String args[])
{
//Father father =new Father(new son(this);//no
//Son son = new Son(new Father()); //yes
//System.out.println(Father.count+Son.count);
Father father = new Father();
Son son = new Son(father);
System.out.println(Father.count+Son.count);
System.out.println(Father.count);
}
}
代码编译通过了,然后运行。。。不知道是什么情况,是陷入了构造死循环了?
这是一条镜像帖。来源:北邮人论坛 / java / #29037同步于 2014/3/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[讨论]编译器这样都不会报错。。。
shan10211865
2014/3/27镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
子類的構造函數執行之前總是要先執行父類的構造函數。如果構造函數的第一個語句不是super(xxxxxxxxxx)的話,默認會調用不帶參數的構造函數。
不過,這個例子就是,子又生孫,孫又生子,子又有子,子又有孫,子子孫孫無窮匱也,而棧不加增(堆雖加增而內存有限也),何苦而不溢出?
是吧。我发现了,确实是构造死循环,编译器不会检查这样的错。。。
后来把子类的构造函数里添加了super(“null”),然后父类里重载了带参数的构造函数就行了
不过输出了5和3
话说为啥你打字用繁体?
【 在 nuanyangyang 的大作中提到: 】
: 子類的構造函數執行之前總是要先執行父類的構造函數。如果構造函數的第一個語句不是super(xxxxxxxxxx)的話,默認會調用不帶參數的構造函數。
: 不過,這個例子就是,子又生孫,孫又生子,子又有子,子又有孫,子子孫孫無窮匱也,而棧不加增(堆雖加增而內存有限也),何苦而不溢出?
好玩……
【 在 shan10211865 的大作中提到: 】
: 是吧。我发现了,确实是构造死循环,编译器不会检查这样的错。。。
: 后来把子类的构造函数里添加了super(“null”),然后父类里重载了带参数的构造函数就行了
: 不过输出了5和3
: ...................