闲来无事,拿Java来看一下什么叫做“君不君,臣不臣,父不父,子不子”,没有想到的是,下面这段代码竟然可以编译通过,只是在执行的时候就死得很惨了:
分析一下代码,在类Test实例化的过程中要实例化一个SubTest类,而SubTest类实例化时又要先实例化它的父类Test,类Test实例化时又要实例化一个SubTest类...
真是“君不君,臣不臣,父不父,子不子”啊。
下面对代码进行一下简单的修改,将Test中的SubTest实例作为一个静态的类属性,代码如下:
这次可能出乎大家的预料了,这样是可以跑出结果来的,分析一下,应该是第一次实例化Test的时候,会实例化一个SubTest的静态属性,同样,实例化SubTest类时,需要实例化其父类Test,但第二次实例化Test类时将不再实例化类属性SubTest类,因此,不会产生前面的怪圈。
仔细看代码,这当然是个非常不合理的一种设计方式,首先SubTest类是Test类的子类,而Test类中则是存在了对其子类的引用,这样看来,Test类是一个先知了,他可以预先知道对自己做扩展的SubTest类的内容。简单看来,在Test类中有一个SubTest的实例,似乎SubTest应该是Test类的一个“臣”,而SubTest类又是Test类的子类,这样Test和SubTest这两个类似乎不只是“君臣”关系,还有一种“父子”关系,这样会明显给人一种设计不合理的感觉。那么再想一下,我国历代的皇帝与太子又是什么关系呢?Thinking...