[code="java"]
public class Ddppfamily{
public Ddppfamily ddpp;
//....
}
[/code]
为什么在Ddppfamily类中声明一个Ddppfamily的变量?菜鸟问题,请大家不要见笑。
[code="java"]
public class Ddppfamily{
public Ddppfamily ddpp;
//....
}
[/code]
为什么在Ddppfamily类中声明一个Ddppfamily的变量?菜鸟问题,请大家不要见笑。
我想说的是,“为什么”有很多层次,这么笼统的问可能很难得到理想的答案。
如果你说“为什么在Java语言里这样写是合法的”,那是因为Java语言规范中允许递归类型的定义——递归类型就是:1、直接递归,像顶楼的代码那样一个类型直接包含那个类型的成员;2、相互递归,就是A类的实例包含B类的实例为成员,而B类的实例也包含A类的实例为成员。
如果是问“为什么能够实现递归类型”,这既涉及到编译过程也涉及到运行时的支持。
编译时,可以先对整个编译单元在类声明/成员声明的一层扫描一次,将类的结构分析出来之后,再深入到可执行的语句一层;然后到分析语句的语义时,类结构已经明确,查找成员所需要的符号表已经建立好了,所以分析能继续下去。
Java里除了原始类型之外的变量都是引用类型的(数组有细微的例外,忽略)。引用的作用只是指向一个对象(或者为空);引用本身并不包含对象里的所有数据。所以这样的代码完全是可以的:
[code="java"]public class Foo {
private Foo ref;
public Foo() {
this(this); // 让ref成员指向这个实例自身
}
public Foo(Foo ref) {
this.ref = ref;
}
}[/code]
引用的这个语义由Java运行时提供支持,运行没问题。
至于数学概念上“递归类型”的定义……或许你还不需要钻那么深 ^ ^