21、对象
// 普通对象
class Cat(var name:String, var age:Int)
使用:
var mycat = Cat("小花", 1)
// 含有方法的对象
class Cat(var name:String, var age:Int){
fun speak(){
...
}
private fun xuxu(){ // 私有方法
...
}
}
使用:
var mycat = Cat("小花", 1)
mycat.speak() // 对象调方法
mycat.xuxu() // 编译报错,调不到私有方法
22、继承(父类加open)和重写(override)
open class Father {
var firstName = "李"
open fun method(){
...
}
}
// 继承
class Son : Father(){ // 继承使用构造格式,并在父类加open关键字
override fun method(){ // 重写父类方法,需要父类方法加open关键字
...
}
}
23、抽象类(abstract)和继承
// 抽象类
abstract class Human(var name:String){
abstract fun eat()
}
// 继承
class Man(name:String) : Human(name) {
override fun eat(){
...
}
}
24、多态
var person1 = Man("小明")
var person2 = Woman("小花")
var list = listOf<Human>(person1, person2) // 都属于Human类型
for(item in list){
...
}
25、接口(interface)和实现(model1 is Interface1 使用is关键字判断是否属于该类型,和Java中的instanceof类似)
抽象类代表的是事物的本质,接口代表的是事物的能力
// 接口
interface IAnimal{
fun speak()
}
// 实现类
class Cat : IAnimal {
override fun speak(){
...
}
}
26、代理和委托
// 当调用委托人的接口中方法时,将调用到代理人的接口中该方法
class 委托人 : 接口 by 代理人() {
// 不做任何重写
}
// 重写接口中方法,可以在调用代理人方法前、后做一些事情
class 委托人 : 接口 by 代理人() {
override fun methodInInterface(){
...执行代理人方法前
代理人().methodInInterface()
...执行代理人方法后
}
}
27、单例(object关键字)
object 代理人 : 接口 {
...
}
class 委托人 : 接口 by 代理人 { // 代理人不再使用构造方法格式
override fun methodInInterface(){
...执行代理人方法前
代理人.methodInInterface() // 这里使用同一个对象,因为代理人是单例了
...执行代理人方法后
}
}
28、枚举(enum)
enum class Orientation{
up, down, left, right
}
使用:
Orientation.up // 获得枚举对象
Orientation.up.name // up
Orientation.up.ordinal // 0表示顺序
29、印章类(sealed)
// 为了指定某个类里的可实现类型
sealed class Cat{
class WhiteCat() : Cat()
class BlackCat() : Cat()
fun speak(){
...
}
}
使用:
var cat : Cat = Cat() // 编译报错,Cat类不能被实例化
var cat1 : Cat = Cat.WhiteCat()
var cat2 : Cat = Cat.BlackCat()
30、闭包(函数式编程,让函数拥有对象的能力)
fun test() : Unit { // 返回值类型为空
var i = 3
i++
println(i)
}
fun test() : () -> Unit{ // 返回值类型为一个函数,函数没有接收参数且返回类型为空
var i = 3
return fun(){
i++
println(i)
}
}
使用:
var demo = test()
demo.i // 编译报错,拿不到i
demo() // demo是个函数,可以调用
demo()