本篇探索Kotlin中存在的一些关于方法参数的问题。
名称遮蔽
首先看这样一个例子:
|
|
在形参已经命名为name的情况下,方法体以及方法体中的if语句块中,都重复声明了name变量,这就是名称遮蔽,是Kotlin提供的一种特性。
反编译后部分结果如下:
|
|
可以看出,val name = 3
这条语句会编译成将3这个值istore_1上,而参数中的name是存放在局部变量表的0号位置的,所以它们不冲突。
val name = "nihao"
这一句会将字符串“nihao”进行astore_2操作,即这里声明的变量是存放在局部变量表的2号位置的,同样不冲突,当这个if语句结束后,第15和16句似乎做了一个清零的动作。
不过这里有个小疑问,标号为第6、第7的字节码指令有何作用?
构造方法的参数前添加var/val与不添加的区别
观察下面的例子:
|
|
来看看A和B反编译后构造方法的区别,首先是A:
|
|
接下来是B:
|
|
从反编译的结果来看,A,B两种写法做了同样的事,它们都涉及到一个关键的字节码指令putfield,不同之处在于,一个为selfname赋值,一个为name赋值。
所以构造方法的参数前添加var/val与不添加的区别在于,是否通过putfield将构造方法内的局部变量赋值给类的字段。如果不添加var/val,类的闭包结构将无法直接调用参数变量。
小结
本篇解析了在实际写码过程中发现的几个小问题。