Mars酱 2009-03-21 15:53
浏览 195
已采纳

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

[code="java"]
public class Ddppfamily{
public Ddppfamily ddpp;

//....

}
[/code]
为什么在Ddppfamily类中声明一个Ddppfamily的变量?菜鸟问题,请大家不要见笑。

  • 写回答

3条回答 默认 最新

  • rednaxelafx 2009-03-21 17:01
    关注

    我想说的是,“为什么”有很多层次,这么笼统的问可能很难得到理想的答案。

    如果你说“为什么在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运行时提供支持,运行没问题。

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型