Kotlin支持面向对象的三大特征:继承、多态、封装。提供了private、protected、internal、public四个访问权限修饰符。
1、Kotlin定义类,语法:
[修饰符] class 类名 [constructor 主构造器]{
零到多个次构造器
零到多个属性
零到多个方法
}
修饰符:可以是public|internal|private(只能出现其中之一)、final|open|abstract(也只能出现其中之一)或者完全省略修饰符。
Kotlin类的定义:类名、类头(泛型声明、主构造器等)和用花括号包围的类体构成。类头和类体都是可选的【空类没有类体,可以省略花括号】,比如class EmptyClass。
2、一个Kotlin类有0~1个主构造器、0~N个次构造器。主构造器是类头的一部分,它跟在类名和泛型声明之后:
class User constructor(name:String){}//如果主构造器没有任何注解或修饰符,则可以省略constructor关键字。
主构造器是在类头使用constructor关键字定义一个无执行体的构造器。虽然主构造器不能定义执行体,但是可以定义多个形参,这些形参可以在属性声明、初始化块中使用。
关于默认构造器:如果没有为非抽象类定义任何的主/次构造器,系统会自动提供一个无参数的主构造器,该构造器默认用public修饰。一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器。
3、类的属性
[修饰符] var|val 属性名:类型 [= 默认值]
[<getter>]
[<setter>]
修饰符:可以省略,也可以是private|protected|internal|public、final|open|abstract。
public|protected|private只能出现其中之一,final|open|abstract也只能出现其中之一。
对于属性使用protected|internal|public修饰符和不使用访问控制符,效果是一样的。如果使用private修饰该属性,该属性将作为幕后属性使用。
[<getter>]|[<setter>]:用于为该属性编写自定义的getter、setter方法。如果不指定,kotlin会为读写属性提供默认getter、setter方法,为只读属性提供默认的getter方法。
4、顶层函数与类中方法的区别
主要区别在于修饰符:顶层函数不能使用protected、abstract、final修饰符。但类中的方法可以使用private|protected|internal|public、final|open|abstract这些修饰符。
5、构造器的语法:
[修饰符] constructor (形参列表){
//零到多条可执行语句组成的构造器执行体
}
修饰符:可以省略,也可以是private|protected|internal|public其中之一
形参列表:其格式和定义方法的形参列表的格式完全相同
6、方法与函数的关系
Kotlin中的方法与函数其实是统一的,不仅定义函数和方法的语法相同,而且定义在类中的方法依然可独立出来。也就是说,即使我们将方法定义在类里面,这个方法依然可以转换为函数。
class Person {
var age: Int = 0
constructor() {
this.age = 10
}
fun showAge() {
println(age)
}
}
fun main(args: Array<String>) {
var show = Person::showAge//将showAge方法独立成函数,调用showAge方法的调用者将作为第一个参数传入
var p = Person()
show(p)
}
7、解构与componentN方法
Kotlin允许将一个对象的N个属性“解构”给多个变量,写法如下:
var(name,pass) = user
Kotlin是怎么知道把哪两个属性赋值给name、pass变量的?其实Kotlin会将上面的赋值代码转换为如下两行:
var name = user.component1()
var pass = user.component2()
如果希望将对象解构给多个变量,那么必须为该对象的类定义componentN方法,程序希望解构多少个变量就定义多少个componentN方法,且该方法使用operator修饰。
class User(name: String, pass: String, age: Int) {
var name = name
var age = age
var pass = pass
operator fun component1(): String {
return this.name
}
operator fun component2(): String {
return this.pass
}
operator fun component