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("界面暂停了")
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342