声明
本文不为博眼球,只是今天脑洞一开,日常嗨皮罢了。 没什么技术含量,只不过是一个引用持有的问题而已,不喜欢可以走,但不要乱喷,谢谢~~
代码public class Clazz {
private Clazz obj;
public Clazz() {
//自引用
this.obj = this;
}
public Clazz getObj() {
return obj;
}
public void setObj(Clazz obj) {
this.obj = obj;
}
public void print1() {
while (this.obj != null) {
System.out.println("没有尽头");
}
System.out.println("你看不到的,嘿嘿");
}
public void print2(Clazz obj) {
Clazz next = obj.getObj();
if (next != null) {
System.out.println("没有尽头");
print2(next);
}
System.out.println("你看不到的,嘿嘿");
}
public static void main(String[] args) {
Clazz obj = new Clazz();
//obj.print1();
obj.print2(obj);
}
}
运行起来的亚子
- obj.print1():死循环……
- obj.print2(obj):Exception in thread “main” java.lang.StackOverflowError……
如上图,比较简陋,无非就是对象持有自己类型的一个属性,属性的引用指向自己本身,也就是说从来都是它自己本身,所以—— 你写非递归就是死循环;递归就是无穷递归导致堆栈溢出。
提醒在处理引用的时候要小心,虽然本例这种低级错误一般人不会犯错,但谁又能保证永远不会错在引用上呢? 小心驶得万年船呀~~