初学kotlin的时候有个疑问一直没有搞懂,为啥kotlin构造函数里面的参数可以用var或者val,普通的fun却不可以,这到底是为什么呢?
我们知道kotlin 声明变量的时候用的语法是
val name : String
主构造函数的参数加上 var 和 val 这只是声明属性以及从主构造函数初始化属性的一种简洁的语法,意思是将该变量作为类的成员变量来使用,是因为主构造函数是类头的一部分吧,在这里直接声明属性使得属性的声明变得很方便、简洁。
class People(val name: String) {}
相当于Java中
public class People{
public String name;
public People(String name) {
this.name = name;
而kotlin函数,就没有这种用法了,
早期的 Kotlin 版本函数参数是可以定义成 var 的,不过后来官方明确了「函数参数都是不可变」这一点。在这篇更新日志里可以找到说明:
The main reason is that this was confusing: people tend to think that
this means passing a parameter by reference, which we do not support
(it is costly at runtime). Another source of confusion is primary
constructors: “val” or “var” in a constructor declaration means
something different from the same thing if a function declarations
(namely, it creates a property). Also, we all know that mutating
parameters is no good style, so writing “val” or “var” in front of a
parameter in a function, catch block of for-loop is no longer allowed.
参考一些回答:
https://segmentfault.com/q/1010000011637287
https://www.imooc.com/wenda/detail/434996
//Kotlin中泛型与vararg可变参数的使用
class KtBase10<T>(vararg objects: T, var isMap: Boolean) {
//out 这里的T只能被读取,不能修改
private val objectArray: Array<out T> = objects
fun showObj(index: Int): T? = objectArray[index].takeIf { isMap } ?: null
加val/var,则参数同时定义了类的成员变量。
比如class ViewHolder(private val number: TextView, val content: TextView,val index:TextView,val tag: ImageView)
这一句已经定义了一个类,类成员有:
private val number: TextView
val content: TextView
val index:TextView
val tag: ImageView
class MagicBox<T : Human>(vararg item: T) {
private var subject: Array<out T> = item
var available = false
//泛型作为返回类型参数
fun fetch(index: Int): T? {
//available 为空就返回空 不然就返回实例本身
return subject[index].takeIf { av.
1.什么都没有,在该类中使不能使用的, 这个参数的作用就是,传递给父类的构造方法
2.使用var 可以在类中使用,相当于 我们声明了一个该类中定义了一个private 的成员变量
3.val表示不让修改该参数 加上了final 修饰符
class Glory (str:String , nom:Int){} 转为Java代码
public final class Glory {
...
的参数将自动成为该类的属性(如 Student类的 sno和grade属性),而没有val 或者 var关键字的参数,其作用域仅限于主构造函数内有效。另外,如果有val关键字,会为其自动添加getter函数,如果是var关键字,则会自动添加getter和setter。
在刚开始学 Kotlin 时,我觉得 val 和 var 之间的区别很简单:val 表示不可变的,var 表示可变的。
但实际上 val 表示的是只读( read-only ),也就是你不能将值再写入 val,但并不意味着其是不可变的。
对于普通变量来说,不可变( immutable )和只读( read-only )之间没什么区别。因为你没有办法复写一...
有可见性修饰或注解的时候,constructor 不能省略。写法和Java类似。次构造不能委托给主构造,因为没有主构造。主构造使用默认参数简化次构造重载。次构造使用委托调用主构造。
转载自https://www.cnblogs.com/gloryhope/p/10485515.html
1.什么都没有,在该类中使不能使用的, 这个参数的作用就是,传递给父类的构造方法
class IdCard(number: Long, name: String) {
对应的java代码
public final class IdCard {
public IdCard(long number, @NotNull String name) {
Intrinsics.che...
可变参数前面可以有其他参数,但是可变参数只能出现在参数列表的最后
用...代表可变参数,...位于变量类型和变量名之间
调用含有可变参数的方法时,编译器为该可变参数隐式创建一个数组,在方法体中以数组的形式访问可变参数
先来看看Java中的剩余参数是咋用的
public class TestVariableParemeters {