Kotlin学习day3——重点函数、内部类、抽象类

2020.7.15

学习目的:掌握函数的基本使用并熟悉几种类

1.普通函数

  • 没有返回值 Unit等价于void,可以不写
  • fun study(money:Int):Int { } 有参数,返回值类型为int
fun show(){

}
//没有返回值 Unit==void,可以不写
fun buy(money:Int):Unit{

}
fun study(money:Int):Int{
    return 8888
}
  • 如果函数的主体只是一句话,且其结果正是返回值,则可以简化
    fun add(a:Int,b:Int)=a+b
    返回值根据等号的右边结果自动推断
  • 带默认值的函数
    fun work(money: Int=10000,name:String,type:String="Android开发"){ }
    给指定参数赋值:work(name = "小王")
//带默认值的函数
fun work(money: Int=10000,name:String,type:String="Android开发"){

}
// work(name = "小王")
  • 可变参数:fun add(vararg score:Int){ }
    使用vararg声明,传入的是一个整型数组,数组名为score
    调用:add(1,3,4,5,6,7,7)
fun add(vararg score:Int){
    var sum=0
    for (value in score){
        sum+=value
    }
    print(sum)
}
// add(1,3,4,5,6,7,7)
  • 内部函数
    函数的内部还可以有函数,如果一个函数的实现要分为几个板块,最好使用内部函数,很集中,并且可以相互调用
fun showView(){
    fun loadData()="图片"
    fun showList(){
        //下载数据
        val img=loadData()
        //展示
        println("下载的图片:$img")
    }
    showList()
}
//升级版showView()
fun showView2(){
    fun loadData()="图片"
    fun showList(){
        //下载数据
        loadData().also {
            println("下载的图片:$it")
            //it就是loadData的返回值,如此操作不需要另外用变量来接收
        }
    }
}

使用also关键字会更加简洁

2.数据类

存储一些基本的数据,没有其他的功能
Kotlin的数据类比java的一般类更加方便,不用提供set/get方法

               数据类的使用要求

  • 1.数据类的主构造函数必须有至少一个参数
  • 2.参数必须使用var或val修饰
  • 3.不能使用 open inner abstract 修饰

数据类自带重写的toString方法,使用also关键字轻松输出对象

data class User(var name:String,var pwd:String,var id:Int){

}
//User("小王","1234",24).also { print(it) }

3.嵌套和内部类

一.嵌套类
  • 嵌套类不能使用宿主类的属性,仅仅是位置上的关系,只需要使用宿主类的类名来调用
二.内部类
  • 内部类和外部类是有联系的,内部类可以使用外部类的属性,内部类依附于外部类,所以要先创建外部类的对象,才能创建内部类的对象
    使用inner关键字声明
class Bank{
    var money=Money(0)
    //钱
    class Money(var num:Int){

    }
    //银行卡
    inner class Card(){
        fun save(count:Int){
            money.num+=count
        }
        fun withdraw(count: Int){
            if(money.num>=count){
                money.num-=count
                println("取款成功")
            }else{
                println("余额不足")
            }
        }
    }
}
//Bank.Money(200)  嵌套类的调用
//Bank().Card().save(20) 内部类的调用

4.匿名类

  • 接口:接口的方法默认是open
  • 匿名类格式:object:接口名{ 重写方法 }
interface OnTouchListener{
    fun onTouchEvent(type:String)
}
fun didTouch(listener: OnTouchListener){
    listener.onTouchEvent("手指按下")
}
//方法1:定义类实现接口->实例化这个实现类
class ButtonListener:OnTouchListener{
    override fun onTouchEvent(type: String) {
        println("接收到的事件为:$type")
    }
}
//ButtonListener().apply { didTouch(this) }
//ButtonListener().also { didTouch(it) }
//方法2:匿名类方式
//  didTouch(object:OnTouchListener{
//     override fun onTouchEvent(type: String) {
//         println("接收到的事件为:$type")
//     }
//   })
  • 匿名内部类
class QQQ{
    fun show(){
        dispatchTouch(object :OnTouchListener{
            override fun onTouchEvent(type: String) {
                println("接收到的事件为:$type")
            }
        })
    }
    fun dispatchTouch(listener: OnTouchListener){
        listener.onTouchEvent("手指在滑动")
    }
    interface OnTouchListener{
        fun onTouchEvent(type:String)
    }
}

5.抽象类

场景:一个界面Activity->加载->显示->结束
一个APP有多个界面,这些界面的共同之处可以抽出来形成一个模板,就是抽象类

  • 抽象类里面可以定义:抽象属性 抽象方法 普通方法->有实现
  • 抽象属性不能初始化,抽象方法不能实现
  • 如果是子类必须实现,那么就定义为抽象方法,否则就定义为普通方法
  • 如果要重写抽象类的普通方法,需要添加open
  • 抽象类同样默认为open,不能实例化
abstract class BaseActivity{
    abstract var title:String
    init {
        run()
    }
    fun run(){
        //创建界面
        onCreate()
        //暂停界面
        //销毁界面

    }
     abstract fun onCreate()
    open fun onPause(){

    }
    fun destroy(){

    }
}
class LoginActivity(override var title: String="登录"):BaseActivity(){
//    override var title: String="登录" 此地也可以
    override fun onCreate() {
        println("开始搭建界面...")
    }
    override fun onPause() {
        println("界面暂停了")
    }
}

你可能感兴趣的:(Kotlin学习day3——重点函数、内部类、抽象类)