学习笔记
1,智能类型转换
fun call(animal:IAnimal){
//判断传递的具体子类类型 转换成子类型
if(animal is IDog){ //is 相当于java的instanceof
// val newDog = animal as IDog //as相当于java的强制类型转换
animal.wangwang() //在判断时,已经自动强转
}else if(animal is ICat){
// val newCat = animal as ICat
animal.miaomiao()
}
}
2,构造函数和次构函数
class Person1(name:String,age:Int) { //主构函数
//定义次构函数
constructor(name:String,age:Int,phone:String) : this(name, age) //次构必须调用主构函数
}
3,泛型
open class Box<T>(var thing:T)
//子类继承Box
class SonBox(thing:Int): Box<Int>(thing)
4,中缀表达式
1,在类的函数加上infix关键字
2,函数参数只能有一个
//不需要点,直接调用
person hello "张三"
class Person{
infix fun hello(name: String){
println("hello $name")
}
}
5,类的委托方式一
//通过关键字 by 委托其去实现
interface WashPower1{
fun wash()
}
//大头儿子已经具备了洗碗能力
class Son1: WashPower1{
override fun wash(){
println("大头儿子洗碗了")
}
}
//小头爸爸 可以把洗碗能力委托给大头儿子实现 ,所以小头爸爸不需要是实现洗碗的方法
class SmallFather: WashPower1 by Son1(){
}
委托方式二
class SmallFather(var son:Son) : WashPower by son
6,延迟加载 当用到时候才会加载 只会加载一次 并且是线程安全的
val lazyValue :String by lazy{
println("") //lazy初始化
"张三" //最后一行返回
}
```
7,扩展函数 ,可以代替java中的各种utils
```
//不需要定义新的对象就可以添加新的函数
//判断字符串是否为空
fun String.isEmpty(){
if(this == null || this.length == 0){
println("为空")
}
}
```
8,单例 object关键字代替class
```
//单例
object Data{
var name = "张三"
fun sayHello(){
println("hello $name")
}
}
//直接使用,不可用new
Data.sayHello()
```
9,实现像java一样的单例
```
//1,私有构造函数
//2,私有并静态对象引用
//3,提供静态方法获取引用属性
class Single private constructor(){
//私有构造函数
companion object{
//延迟加载
val single: String by lazy{
Single()
}
}
}
```
10,半生对象,可以直接访问,类似java的static
```
class MyData{
var age = 20 //需要创建对象访问
companion object{ //半生对象,可以直接访问
var name = "张三"
}
//方式二
companion objext InClass{
}
}
```
11,枚举: 一一列举
```
enum class Week{
item1, item2, item3
}
```
12,数据类bean, 在kotlin 中可以使用data class
```
//里面封装了java代码,get, set, hashcode, tostring,equals, copy, 构造函数
//component1, 代表第一个参数 time
data class Sms(var time:Long, var content: String, var from:String)
```
13,list集合
```
```