Kotlin的类

知识点

作者:郑捡书
转载请注明作者和原文链接,如有行文存在不当请留言说明,谢谢!!

1. 关键字\color{#ea4335}{class}后加类名修饰一个类
2. 变量修饰符:\color{#ea4335}{var}表示可重新赋值,\color{#ea4335}{val}表示不可重新赋值(相当于java的final关键字)
3. 方法声明:\color{#ea4335}{fun}关键字 方法名(方法参数){}
4. 假如一个类无类体,可以省略花括号‘{}’
5. 一个类可以有至多一个主构造函数,类名后添加关键字\color{#ea4335}{constructor},再加构造参数。声明属性以及从主构造函数初始化属性,Kotlin 有简洁的语法,就是直接在主构函数的参数列表声明val或var修饰的属性
6.如果一个非抽象类没有声明构造函数(主构造函数或次构造函数),它会产生一个没有参数的构造函数。构造函数是 public 。如果你不想你的类有公共的构造函数,你就得声明一个私有的无参数列表主构造函数
7. 主构造函数如果没有任何注解或者可见性修饰符(\color{#ea4335}{public}\color{#ea4335}{private}等),可以省略关键字\color{#ea4335}{constructor}
8. 一个类可以有无或者多个次构造函数
9. 如果存在显示主构造函数,则次构函数需要在参数后加\color{#ea4335}{: this (主构函数参数)}表示间接调用主构函数。如果存在继承且在类名后无声明主构函数,则在类体中声明的构造函数要:super(父类构造方法的函数参数列表)
10. 主构函数的参数存在默认值(参数名:参数类型 = 默认参数值)则次构造函参数后面的this中的参数可以不传值
11. 类中的\color{#ea4335}{ init}{}表示初始化代码块(相当于主构函数的方法体),主构函数的参数可以在此代码块出现。初始化块可以有多个,按照声明的顺序执行。初始化期间初始化块和属性初始化按照声明顺序执行(java的类初始化其实就是对字段的初始化)
12.\color{#ea4335}{init}{}代码块的内容先于次构函数的内容执行(因为\color{#ea4335}{init}{}代码块相当于主构函数的方法体,主构函数优于次构函数执行是因为次构函数都会调用主构函数)
13. 主构函数的参数可以赋值给成员属性(也就是说可以给属性使用)
14. var/val关键字修饰的属性

  • 声明属性时同时赋值,也可以放在init()方法中,但as推荐直接赋值;
  • 在var前添加关键字lateinit声明延迟初始化(val关键字不适用此定义)
  • 该类声明为抽象类,该属性声明为抽象属性
  • 放在主构函数的参数列表(创建对象的时候需要赋值),注意要有var或者val关键字,不然就表示参数。
  • 可以提供get方法返回值(var关键字不适用此定义,因为var是可变的)

15. set和get可写也可不写, 不写的话会有默认的实现, 需要注意的是val修饰的变量是没有set方法的, 也不允许重写set方法。
16. get方法的默认格式为:get() = field,field 关键词只能用于属性的访问器,不能像java那么直接返回变量名,因为在kotlin的get中返回变量名相当于递归调用(kotlin中使用该变量名其实相当于调用了该变量的get方法)
17.在 JVM 虚拟机中,如果主构造函数的所有参数都有默认值,编译器会生成一个附加的无参的构造函数,这个构造函数会直接使用默认值,也就能使用无参构造函数来创建对象。(个人猜想jvm估计是帮我们创建了一个无参构造函数,然后使用主构函数的默认值调用主构函数,类似: constructor() : this(主构函数参数的默认值,这个参数可以是方法参数,也可以是val或者var修饰的属性) {} )

  1. 类实例化的时候每个属性必须要有初始值
  2. Nothing没有实例,是所有类型的子类。Any是所有类的父类(相当于java的Object类)

代码示例

// class关键字修饰一个类
class ClassDemo {

    val s: String = ""
    // 1.要么声明的时候赋初始值
    // 2.要么可以放在init()中赋值,但as提示还是直接赋值
    var i: Int = 1

    // 方法
    // 方法声明:fun关键字 方法名(方法参数){}
    fun f() {

    }

    fun f2(s: String) {

    }
}

// 无类体省略了花括号'{}',类体即java中的成员函数和成员变量,而在kotlin中成员变量也叫做属性
class ClassDemo2


// ‘constructor’关键字加构造参数表示主构造函数
// 方法参数表示‘(参数名 : 参数类型)’
class ClassDemo3 constructor(s: String) {

}

// 没有任何注解或者可见性修饰符可以省略关键字‘constructor’
class ClassDemo4(s: String) {

}

// 可见修饰符放在关键字‘constructor’前面
class ClassDemo5 private constructor(s: String) {

}

// 多个次构造函数(类似于java的方法重构)
class ClassDemo6 {
    constructor(s: String)
    constructor(i: Int)
    constructor(s: String, i: Int)
}

class ClassDemo7 constructor(s: String) {
    // 存在主构的话则次构函数在参数后‘: this(主构函数参数)’表示间接调用主构函数
    constructor(i: Int, s: String) : this(s) {

    }
}

// 主构函数参数存在默认值
class ClassDemo8 constructor(s: String = "默认值") {
    // this()括号中可以不传值
    constructor(i: Int, s: String) : this() {

    }
}


class ClassDemo9 constructor(s: String) {

    // 主构函数的参数可以赋值给属性
    val n: String = s
    var n1: String = s

    // 初始化代码块(相当于主构函数的方法体)
    // 主构函数的参数可以在此代码块中出现
    init {
        println("初始化代码块")
        // (知识点)字符串模板 : $符号后面加上属性/变量
        // 字符串模板相当于java中的打印信息引用变量的形式。即: println("调用主构函数的参数s:" + s)
        println("调用主构函数的参数s:$s")
    }

    constructor(i: Int) : this("主构函数参数值") {
        println("次构造函数")
    }
}

class Demo13 {

    var s: String = "哈哈"
    var s1: String
    lateinit var s2: String
    val s3: String = ""
    var s4: String = ""
        get() = field.toUpperCase()
        set(value) {
            if (value == "哈哈") {
                field = "大于"
            } else {
                field = "小于"
            }
        }

    init {
        s1 = "你好s2"
    }

}

fun main(args: Array<String>) {
    // 知识点
    // kotlin创建对象:val/var修饰符  变量名 = 类名(主构或者次构参数值)。
    // java创建对象: private/public修饰符 变量名 = new关键字 类名(构造函数参数值)。会java的同学一看就感觉和kotlin创建对象的方式其实很像
    val classDemo9 = ClassDemo9(1)
}

main方法运行结果

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

推荐阅读更多精彩内容