为什么成员变量有默认值而局部变量没有

先不考虑变量类型,如果没有默认值会怎样?变量存储的是内存地址对应的任意随机值,程序读取该值运行会出现意外。

默认值有两种设置方式:手动和自动,根据第一点,没有手动赋值一定要自动赋值。那么编译器是希望我们手动赋值,还是帮我们自动赋值呢?我觉得应该是前者,因为这能很好让我们程序员在写代码的时候先初始化再使用一个变量,很清楚的知道使用一个变量时,它的值是多少,这才是比较好的规范。

所以成员变量和局部变量都应该是没有默认值的,我们需要先手动赋值,再使用变量。

对于编译器(javac)来说,局部变量没手动赋值很好判断,因为就在一个方法代码块中。没有手动赋值可以直接报错。

而成员变量可能是运行时手动赋值,编译器不知道在哪个方法就被赋值了,甚至在哪个地方可能反射给它赋值,这就无法判断是先使用还是先赋值初始化,而误报“没默认值”又会影响用户体验(都tm运行了你和我说我代码有问题?为什么编译不帮我检查出来?),所以采用自动赋默认值

kotlin就得强制赋值