第四章:类、对象和接口

定义类继承结构

  1. 接口的声明:关键字: interface ,可以有一个默认实现,只需要提供方法体即可;
  2. 继承(实现)使用:符号,一个类可以实现任意接口,但只能继承一个类(与Java相同);override修饰符用来标注被从重写的父类或者接口的方法和属性,被强制要求;
    在这里插入图片描述
  3. 调用父类的实现方法: super.method()
  4. 允许创建基类: open修饰符来修饰该类,此外需要给每一个可以被重写的属性和方法添加open属性,Kotlin中类和方法默认都是final;override修饰符意味着是open的,如果需要禁止被重写需要手动添加final修饰符;
  5. 抽象类: abstract , 不能被实例化
    在这里插入图片描述
  6. 可见性修饰符:默认是public , 同样具有private, protected;
    新的修饰符:internal 只在模块内部可见,一个模块就是一组一起编译的Kotlin文件;
    在这里插入图片描述
    注意:Kotlin禁止从public权限去引用低可见类型;protected只能在类和它的子类中可见,同包中的无法访问;扩展函数不能访问它的private和protected成员;
  7. 内部类和嵌套类
    Kotlin中没有显式修饰符的嵌套类与Java中的static嵌套类是一样的; 要把它变成一个内部类来持有外部类的引用需要使用inner 修饰符;
    在这里插入图片描述
    引用外部类实例,使用this@OuterName
  8. 密封类:定义受限的类继承结构 修饰符: sealed ;作用:所有的直接之类必须嵌套在父类中(v1.0),若该类被sealed修饰,则隐含该类是Open的;

声明一个带非默认构造方法或者属性的类

  1. constructor关键字用来开始一个主构造方法或者从构造方法的声明;
    在这里插入图片描述
  2. 主构造方法: 类头部的类名后声明的构造方法
  3. init{} 引入一个初始化语句块;
  4. 如果一个类具有一个父类,主构造方法需要初始化父类,如果继承的类没有声明任何的构造方法,必须显式调用父类的构造方法,即时它没有任何的参数;接口没有构造方法,不需要加上括号;
  5. 不被其他代码实例化:把构造方法标记为private
  6. 不要声明多个从构造方法用来重载和提供参数的默认值,取而代之的是直接标明默认值 ;
    在这里插入图片描述
    调用父类的构造方法:
    在这里插入图片描述
  7. 调用父类的构造方法: super(params…)
  8. 调用自己类的其他构造方法: this(params…)
  9. 实现在接口中声明的属性 ,需要重写该属性
    在这里插入图片描述
    实现User接口的类需要提供一个取得nickname值得方式:
    • 在主构造方法中重写抽象属性,需要把该属性标记为override;
    • 通过一个自定义getter实现;
    • 通过与某个函数进行关联
      在这里插入图片描述
  10. 接口可以包含具有getter和setter得属性,不能引用一个支持字段(支持字段需要在接口中存储状态,而这是不允许的)
    在这里插入图片描述
    第一个属性必须被重写,第二个可以被继承;
  11. 通过getter和setter访问支持字段(field)
    在这里插入图片描述
    在setter的函数体中使用field来访问支持的字段值,在getter中只能读取值,而在setter中既能读取也能修改,
  12. 修改访问器的可见性

在这里插入图片描述

数据类与类委托

  1. ==表示相等性:比较两个对象的默认方式(本质上就是通过调用equals来比较两个值的),如果需要进行引用比较,三个等号;
  2. is检查是Java中instanceOf的模拟,逆运算是 !is
  3. 数据类: 自动生成通用方法的实现 修饰符: data class 会自动重写equals, hashCode, toString方法,注意只有在主构造方法中声明的属性才会进行相等性检查和哈希值的计算;
    数据类不强制要求使用val,也可以使用var,但建议使用只读属性;
    数据类会自动添加copy方法来创建副本(副本有着单独的生命周期而且不会影响代码中原始的实例的位置)
  4. 类委托by 原理类似于装饰器模式:这种模式的本质是创建一个新类,实现与原始类一样的接口并将原来的类的实例作为一个字段保存。与原始类拥有同样行为的方法不用被修改,只需要直接转化给原始类的实例就行;
  5. object关键字:将声明一个类与创建一个实例结合起来
    使用场景:
    • 对象object
      object 对象声明将类声明与该类的单一实例声明相结合到一起;
      对象与类一样,可以包含属性,方法,初始化语句块等,但不允许构造方法(包含主构造方法和从构造方法)
      可以使用对象名.字符的方式来调用方法和属性
      可以在类中声明
      对象声明是定义单例的一种方式
    • 伴生对象companion object工厂方法、静态成员
      伴生对象可以访问类中所有的private成员,包括private的构造方法;
      伴生对象可以有名字,但仍可以通过类名来直接调用,也可以加上伴生对象的名字;
      伴生对象的前提是对象
    • 对象表达式用来替代匿名内部类
      在这里插入图片描述
      在这里插入图片描述
      与对象声明不同的是,匿名对象不是单例的

猜你喜欢

转载自blog.csdn.net/ChrisSen/article/details/88423195