类的定义
接口 interface
类似 Java8 接口中的方法可以有默认实现,但是不需要 default 关键字来标识,以是否有方法体的存在来区分
-
override修饰符,强制要求写
一个类实现多个接口时,若有相同方法在不同的接口中有默认实现,那么在实现类中要明确重写这个方法
//调用接口的默认逻辑,通过<>来指定
super<AInterface>.sum()
super<BInterface>.sum()
Kotlin1.0 是以Java6 为目标设计的,其并不支持接口中的默认方法。因此它会把每个带默认方法的接口编译成一个普通接口和一个将方法方法体作为静态函数的类的结合体。接口中只包含声明,类中包含了以静态方法存在的所有实现。因此,如果需要在Java类中实现这样一个接口,必须为所有的方法,包括在kotlin中有方法体的方法定义你自己的实现。
继承性修饰符 open、final、abstract
因Java中存在脆弱的基类问题,kotlin中类的声明默认是 final的,即不可被继承的。
- open : 使得类可以被继承,方法可以被重写
- abstract:抽象类,抽象方法
- final:禁止类被继承,禁止方法被重写
接口中的方法(包括抽象方法,以及默认实现的方法),默认都是 open 的。被 override 修饰的方法也默认是 open的。当然 override 的方法可以显示的声明为final 的,禁止被重写。
可见性修饰符
- public : 默认是public
- internal:模块内可见
- protected:子类可见
- private:私有
- kotlin中不存在Java中包私有的概念,即protected 不具有包权限,仅在其子类中可见
通用规则:类的基础类型和类型参数列表中用到的所有类,或者函数的签名都有与这个类或者函数本身相同的可见性
类的扩展函数不能访问它的private 与 protected 成员
kotlin 编译成字节码后与Java的对应关系:public -> public;internal -> public;protected -> protected;private -> private
所以存在这个现象:当一个类声明为internal 或者 protected ,在kotlin中不可访问的地方,当转换为Java时,某些kotlin不可用的场景在Java中确实可见可访问的。
嵌套类 内部类
默认是 嵌套类,对应Java的静态内部类,即不持有外部类的引用。
- inner : 使得嵌套类变为内部类,持有外部类的引用
- this@Outer : 通过这种方式来访问外部类 Outer 的引用
密封类 sealed
委托类 by
关键字 object
Kotlin 中 object 在多种情况下都出现,但是他们都遵循一个核心的理念:
object定义一个类并同时创建一个实例
- 对象声明:是定义单例模式的一种方式
- 伴生对象:可以持有工厂方法和其他与这个类相关,但是在调用时并不依赖类实例的方法。它们可以通过类名来访问
- 对象表达式:用来代替Java的匿名内部类








网友评论