1
2
3
4
5
class MyClass constructor(i:Int)  // 1
class MyClass(i:Int) // 2
class MyClass(val i:Int) // 3
class MyClass(var i:Int) // 4
class MyClass(private val i:Int) // 5

以上是 Kotlin 主构造函数的几种写法,区别在于:

1、1和2写法是一个意思,平时为方便,基本都用第二种,但在一些特定情况下,必须使用第一种,比如有注释限定符(如@Inject等)、可见性修饰符(如private等)。

2、3和4写法也是一样的,除了属性gettersetter生成区别。var表示该属性可以被修改,val表示该属性不能被修改,所以对应的 val i:Int 只会生成 getter 方法,var i:Int 会同时生成gettersetter 方法。

3、2与3/4的区别在于: class MyClass(i:Int) 这种写法的参数 i 只能在构造期间使用,你可以将它传递给超类构造函数,或者在属性初始化函数、或者 init 块中使用。 而 class MyClass(val i:Int) 这种写法则是 Kotlin 为了简化开发的语法糖。

Kotlin 会创建一个与参数同名的属性,并为您初始化它。所以类的每个实例都有一个名为 i 的属性(并且有 gettersetter 方法),您可以随时引用它。

4、5与3/4的区别在于给属性 i 添加了可见性修饰符。

默认情况下,Kotlin 中的属性是公共的:您可以从类内部、子类、同一模块中的其他类以及具有 MyClass 实例的任何其他代码访问它们。
但是,在某些情况下,限制访问很有用,因此您可以添加可见性修饰符:internal 阻止其他模块中的代码看到它,protected 仅允许子类看到它,而 private 使其仅在类本身内部可见。