为什么a类中可以声明一个a类的变量?

[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运行时提供支持,运行没问题。

至于数学概念上“递归类型”的定义……或许你还不需要钻那么深 ^ ^

自己可以做为自己的属性

因为语法解析器读到 "public class Ddppfamily{" 时,这个类型就已经声明了(虽然其内容还没定义),所以可以用。

这种写法一般用来表达链表或者树形结构。

成员变量ddpp是引用,可以理解成一个指向Ddppfamily的实例的指针,它也可以等于null,这样就表示这个链到头了。