初学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 时,我觉得 valvar 之间的区别很简单: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 {