在编写代码时,总会遇到一些“奇怪”的要求或者约束,仔细想想跟正常逻辑似乎不太对应,这时候就需要换个角度来理解了。
比如,按照声明顺序初始化,对象初始化包括两步操作,先初始化后计算赋值。
再比如,代码中的一些稀奇古怪的写法,列表方式,,,,Java的main在class中(虽然这是为了贯彻Java的彻底面向对象要求,但是个人觉得main单独提出来,按照其本意独立使用,似乎更好理解)。
其实,这些都转换成容易理解的方式即可,不必去深究,否则就是钻牛角尖了。因为他们都只是语义的表达,严格来讲,并非完全、严密的符合数学中关于闭合系统的定义。比如类的定义中使用类的类型(这时候类可能还没有描述完成,逻辑上讲是不合理的)。这些东西,只要符合语言的语法即可,因为有更严格的编译程序,以语法为框架和约束条件,对代码进行解释处理,将其转化为更加严格的,更加符合逻辑的形式。最终会是代码的等价形式,但是解释可能就不一样。
类似的,对于一个类的定义中,使用类的各种操作,严格意义上来讲,类的定义未完成,使用类的东西,是不符合逻辑的,至少按照先有后用的逻辑来理解是这样,因为有些东西还没有确定下来。但是代码写完了,类的定义肯定也就完整了,我们可以理解,编译程序解释代码时,如果发现类的定义还没有完成,就用到了类的一些东西,那么可以先把使用的地方空下,等类的定义完整了,再补充上去。但是,如果要求写代码时,类定义未确定前,不能使用该类型,那么,按照这种方式来写,最终代码可能太死板或者会太别扭,更有可能需要考虑额外考虑本来可以由编译器做的部分工作,这进一步的影响到效率。
总的来讲,编译器就类似做了代数工作,用xy先代替,完了再替换。
另一个方面,可以将代码看成是意思的表达,编译器看作是解释的表达,最终转化后,是内存的一片土地上的各种建筑元素,用来构成最终的大建筑的。