kotlin基础-类

一、类组成

1.主构造函数

参数类型写法的三种情况:

//_name 带下划线的是临时类型,必须要二次转化才可以用
class A(_name: String) {
    val mName = _name;//1.直接给类成员变量赋值
    var mName2:String=""
    init{
        mName2= _name//2.在初始化代码块中使用或者赋值
    }
    fun log() {
        System.out.println(mName)
    }
}
//就可以直接用(相对比上面的写法是简洁语法)
//与普通属性一样,主构造函数中声明的属性可以是可变的(var)或只读的(val)
class B(val name: String) {
    fun log() {
        System.out.println(name)
    }
}
//如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的
//没有的话可以省略,比如上面两种写法
class C private constructor(val name: String) {
    fun log() {
        System.out.println(name)
    }
}
2.次构造函数

次构造函数需要委托给主构造函数(直接委托或者通过别的次构造函数间接委托)

class B(val name: String) {
    constructor(sex:String,name:String):this(name)
    fun log() {
        System.out.println(name)
    }
}

!!再者次构造函数不能用var或者val修饰

3.初始化块

执行顺序:主构造函数→ 初始化代码块→ 次构造函数
但是,成员变量和初始化代码块的顺序是按书写的顺序执行的,谁在上面谁就先执行

val name="tina"  //第一步
init{
//第二步
}
val sex="女" //第三步
4.延迟加载
  1. lateinit
class AA {
    lateinit var name: String//可以先不赋值,什么时候用到什么时候赋值
    fun log() {
        if (::name.isInitialized) {
            System.out.println("初始化")
        } else {
            System.out.println("还没有初始化")
        }
    }
}
  1. by lazy
val date by lazy {
        println("")
    }
不能用var修饰,因为只可读
Type 'Lazy<Unit>' has no method 'setValue(AA, KProperty<*>, Unit)'
and thus it cannot serve as a delegate for var (read-write property)
5.field 隐藏域变量

变量的set get方法中,赋值用

二、类的种类

匿名类

object的使用

open class Father {
    open fun add(info: String) = println(info)
    open fun del(info: String) = println(info)
}

class Son : Father() {
    override fun add(info: String) {
        super.add(info)
    }

    override fun del(info: String) {
        super.del(info)
    }
}

fun main() {
    //匿名对象表达式方式
    val son: Father = object : Father() {
        override fun add(info: String) {
            super.add(info)
        }

        override fun del(info: String) {
            super.del(info)
        }
    }
    //具名方式
    val son2 = Son()
}
数据类

关键词:data
特点:已经写好了一些需要使用的常用方法
解构

data class Food(val name: String, val number: Int)

fun main() {
    val (name, number) = Food("牛奶", 2)
    println("name=$name number=$number")
}
内部类(嵌套类)

嵌套类 默认是嵌套类,里面的类不能访问外部的类
内部类 里面的类添加inter 关键字,然后就可以访问外部类的信息

枚举类
//第一种普通方法
enum class Week{
    星期一,
    星期二,
    星期三
}
fun main(){
   println(Week.星期一)
}

//第二种 定义函数方式
class LimbsInfo(var name: String, var length: Int) {
    fun show() {
        println("$name 的长度是:$length")
    }
}

enum class Limbs(private val limbsInfo: LimbsInfo) {
    //定义函数
    LEFT_HAND(LimbsInfo("左手", 22)),
    RIGHT_HAND(LimbsInfo("右手", 22));

    fun show() = "左右手:${limbsInfo.name}的长度是${limbsInfo.length}"
    fun update(limbsInfo: LimbsInfo) {
        this.limbsInfo.name = limbsInfo.name
        this.limbsInfo.length = limbsInfo.length
        println(show())
    }
}
fun main(){
     println(Limbs.LEFT_HAND.show())//输出内容
     Limbs.LEFT_HAND.update(LimbsInfo("右腿", 100))//更新内容
}
结果:
左右手:左手的长度是22
左右手:右腿的长度是100
密封类

感觉跟枚举很像

sealed class Exams {
    object Type1 : Exams()
    object Type2 : Exams()
    object Type3 : Exams()
    class Type4(val name: String) : Exams()

}

class Teacher(private val exams: Exams) {
    fun show() =
        when (exams) {//必须全包含集中类型type1-->type4
            is Exams.Type1 -> "type1"
            is Exams.Type2 -> "type2"
            is Exams.Type3 -> "type3"
            is Exams.Type4 -> "type4${exams.name}"
        }
}

fun main() {
    println(Teacher(Exams.Type1).show())
    println(Teacher(Exams.Type4("李四")).show())
    println(Exams.Type1 === Exams.Type1)//true
    println(Exams.Type4("张三") === Exams.Type4("张三"))//false
}

其他

运算符重载

//重载+运算符
data class AddClass(var number1: Int, var number2: Int) {
    operator fun plus(p1: AddClass): Int {
        return (number1 + p1.number2) + (number2 + p1.number2)
    }
}

fun main() {
    println(AddClass(1, 1) + AddClass(2, 2))
}
伴生对象

相当于java中的static

companion object {
       const val info = "2323"
    }

三、类型转化

as 强转
is 判单类型

四、继承

类要被open修饰才可以继承

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

推荐阅读更多精彩内容