kotlin类和对象

一:类

kotlin使用class关键字来声明类

class Invoice{}
class Empty   //如果类没有实体可以省略{ }

二:构造函数

kotlin中一个类可以有一个主构造函数以及一个或多个次构造函数。

1.1:主构造函数

它跟在类名(与可选的类型参数)后,如果没有注解或可见性修饰符可以省略constructor关键字

class Person constructor(name: String) {}
class Person (name: String ){}     //这两个声明是一样的

主构造函数不能包含任何代码块, 初始化的代码可以放到以init关键字为前缀的代码块中。

class Person (val name: String) {
    val s  = "name $name".also(:: println)
    init {
        println("init name : $name")
    }
   val tian = "songtao $name".also(::println)
}

注意:主构造函数中的参数可以在初始化块中使用,也可以在类体内声明的属性初始化器中使用。
在类实例化期间,初始化块和属性初始化器按住在类中编码的顺序执行。

1.2:次构造函数

类也可以声明前缀有constructor的次构造函数,如果一个类中有主构造函数那么每一个次构造函数都需要
委托给主构造函数,可以直接委托也可以通过别的次构造函数委托,委托同类构造函数使用this关键字

class Person (val name: String) {
    val s  = "name $name".also(:: println)
    init {
        println("init name : $name")
    }
    val tian = "tian name: $name".also(:: println)

    constructor(name: String, age: Int): this(name) {

    }
}

注意:初始化块中的代码实际会作为主构造函数的一部分,委托给主构造函数实际上会作为次构造函数的第一条代码执行。因此初始化块都是执行在次构造函数之前,即使没有主构造函数这种委托也会隐式存在。
如果一个类没有任何主次构造函数,它会生成一个不带参数的主构造函数,如果你想你的类没有一个公共的主构造函数,可以用限制符声明它的非公共主构造函数

class Tian private constructor(){}

三:创建类的实例

kotlin中没有Java的new关键字,实例化类像普通函数一样调用构造函数

val person = Person("tian")

四:类成员

类的成员包括

  • 构造函数和初始化块
  • 函数
  • 属性
  • 嵌套类和内部类
  • 对象声明

五:继承

kotlin中所有的类都有一个共同的超类Any, 和Java中的object一致,没有超类声明的类Any就是它的默认超类,要声明一个超类,我们把类型放到类头的冒号后. kotlin力求显示清晰,与Java不同,kotlin对于公开的超类和可重写的函数都需要用时open关键字来显示指定公开,类似java中的public。

open class Person
class Man : Person
open class Woman(name:String): Person()
class Student(name:String): Woman(name)  
class MyView: View{
    constructor(context: Context): super(context)
    constructor(context: Context, attrs: AttributeSet): super(context, attrs)
}

注意:如上,如果子类有主构造函数,那么超类就可以直接用子类主构造函数中的参数直接初始化。如果类没有主构造函数,那么每个次构造函数都需要使用super关键字来初始化超类,也可以委托给其他次构造函数,不同次构造函数也可以调用不同的超类次构造函数。

六:覆盖方法

可以被子类覆盖的方法为公开方法,也需要使用open显示指定

open class Person{
    open fun open(){
        println("open")
    }

    fun unOpen(){  //没有open显示指定,这个函数不能被重写覆盖,
        println("unOpen")
    }
}

class Man : Person(){
    override fun open() {    //这里必须使用override关键字来修饰,
        super.open()
    }
    final override fun open(){  //子类不可在覆盖
      super.open()
    }
}

注意:不可覆盖的方法在子类和超类中不可有相同函数名的函数,也就是Man类中不可定义超类的unOpen函数。override本身就是open的,Man的子类也可覆盖open函数,如果不想覆盖就使用final关键字修饰。

七:覆盖属性

覆盖属性和覆盖方法类似。

八:调用超类的实现

1.1:子类调用超类函数使用super关键字,

class Man : Person(){
    override fun open() {    //这里必须使用override关键字来修饰,
        super.open()
    }
}

1.2:子类内部类调用子类超类。

内部类调用外部类的超类可以使用super关键字的限定名来实现,super@outer

class Man: Person(){
      override fun open(){
          super.open()
      }
      inner class student{
          fun g(){
              super@Man.open()  //这里使用@标记super为谁的super,这里这个关键字super是Man的super,
                    //所以这个super@Man.open()调用的是Man的超类Person的open函数。  
          }
      }
}

1.3:多超类情况

如果一个类从它的直接超类继承相同成员的多个实现,它必须覆盖(重写)这个成员并自己实现,为了表明
采用的的那个超类继承的实现,可以使用super<超类名>来限定是那个超类。

open class A {
    open fun f(){}
}

interface B {
    fun f(){}
}

class C: A(), B {
    override fun f() {
        super<A>.f()  //super后跟<超类名>来标记调用的是那个超类的函数
        super<B>.f()
    }
}

九:抽象类

kotlin中抽象类和Java中的类似,抽象类中的抽象函数可以没有函数体。抽象函数自带open不用显示声明

open class A{
  open fun f(){}
}

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

推荐阅读更多精彩内容

  • Kotlin 类和对象(六) 上一篇我们讲了Kotlin的循环还有条件控制Kotlin 循环和条件控制(五) ,这...
    Diosamolee阅读 460评论 0 0
  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 4,355评论 1 6
  • Kotlin 类、对象和接口Kotlin 的类和接口在概念上跟 Java 是一样的,但是用法存在一些差别,比如继承...
    guanpj阅读 984评论 0 3
  • 深入构造器 构造器用于在创建实例时执行初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射等方式创建对象,其...
    凌寒天下独自舞阅读 308评论 0 1
  • 类定义 同Java一样,一个类可以具有以下: 函数 主构造函数 主构造器是类头部的一部分,位于类名称之后. 如果主...
    郎官人阅读 630评论 0 0