Kotlin基础(二)——面向对象

抽象类和接口

接口

  • 直观理解就是一种约定,Kotlin的接口与Objective-c的Proticol比较类似
  • 不能有状态
  • 必须由类对其进行实现后使用

抽象类

  • 实现了一部分协议的半成品
  • 可以有状态,可以有方法实现
  • 必须有子类集成后使用

抽象类和接口的共性

  • 比较抽象,不能直接示例化
  • 有需要子类(实现类)实现的方法
  • 父类(接口)变量可以接受子类(实现类)的示例赋值

抽象类和接口的区别

  • 抽象类有状态,接口没有状态
  • 抽象类有方法实现,接口只能有无状态的默认实现
  • 抽象类只能单继承,接口I可以多实现
  • 抽象类反映本质,接口体现能力

继承(实现)语法要点

  • 父类需要open才可以被继承(抽象类不需要,生来就是被继承的)
  • 父类方法、属性需要open才可以被复写
  • 接口、接口方法、抽象类默认为open
  • 覆写父类(接口)成员需要override关键字
  • class D:A(),B,C
  • 注意继承类时实际上是调用了父类构造方法
  • 类只能但继承,接口可以多实现

接口代理

  • 接口方法实现交给代理类实现
interface Driver{
    fun drive()
    fun abc()
}

class Manager(driver:Driver):Driver by driver


class Manager(driver: Driver):Driver{
    override fun drive(){
        driver.drive()
    }
    override fun abc(){
        driver.abc()
    }
}

接口方法冲突

  • 接口方法可以有默认实现
  • 签名一致且返回值相同的冲突
  • 子类(实现类)必须覆写冲突方法
  • super<父类(接口)名>.方法名(参数列表)

类成员的可见性对比

Kotlin Java
private private
protected protected
- default(包内可见)
internal(模块内可见) -
public public

object

  • 只有一个实例的类
  • 不能自定义构造方法
  • 可以实现接口、继承父类
  • 本质上就是java中最简单的单例

伴生对象与静态方法

  • 每个类可以对应一个半生对象
  • 半生对象的成员全局独一份(针对类来说的)
  • 半生对象的成员类似java的静态成员

伴生对象与静态成员

  • 静态成员考虑用包级函数、变量代替(不依赖于某一个类)
  • Java中要调用Kotlin的伴生对象的方法,在Kotlin代码中添加@JvmStatic注解方便调用,调用成员,添加@JvmField
//Kotlin代码
package printlin.net

/**
 * @created  2018/11/2 12:06
 * @description:
 * @author sunxiaxia
 */
fun main(args: Array<String>) {
    val a = minOf(args[0].toInt(), args[1].toInt())
    val latitude2 = Latitude.ofDouble(5.0)
    val latitude = Latitude.ofLatitude(latitude2)
    println(latitude.TAG)
}

class Latitude private constructor(val value: Double) {
    companion object {
        fun ofDouble(double: Double): Latitude {
            return Latitude(double)
        }

        @JvmStatic
        fun ofLatitude(latitude: Latitude): Latitude {
            return Latitude(latitude.value)
        }
    }
    @JvmField
    val TAG:String = "Latitude"

}

//Java代码
public class JavaStatic {
    public static void main(String...args){
        Latitude latitude = Latitude.Companion.ofDouble(6.0);
        Latitude latitude1 = Latitude.ofLatitude(latitude);
        System.out.println(latitude1.TAG);
    }
}

方法重载和默认参数

- 方法重载(Overloads)

  • 名称相同、参数不同的方法
  • Jvm函数签名的概念:函数名、参数列表,跟返回值无关

默认函数

  • 为函数参数设定一个默认函数
  • 可以为任意位置参数设置默认值
  • 函数调用产生混淆时用具名参数

方法重载与默认参数

  • 二者的相关性以及@JvmOverloads
  • 避免定义关系不大的重载
  • 不好的设计
//java中
List.remove(int)
List.remove(Object)
//在Kotlin中
List.removeAt()=>List.remove(Int)
List.remove(Object)=>List.remove(Object)

扩展成员

  • 为现有类添加方法,属性
fun X.y():Z{...}
val X.m //注意扩展属性不能初始化,类似接口属性
  • java调用扩展成员类似调用静态方法:对应的Kotlin类名Kt.方法名
fun main(args: Array<String>) {
    println("hello".multiply(3))
}
fun String.multiply(int:Int):String{
    val stringBuilder  = StringBuilder()
    for (i in 0 until int){
        stringBuilder.append(this)
    }
    return stringBuilder.toString()
}
//Java中调用
  ExtendsKt.times("kjhfj",7);

属性代理

//定义方法

val/var name:Type by expression
  • 代理者需要实现相应的setValue/getValue方法
  • lazy原理剖析

数据类(Data clas,再见JavaBean)

  • 默认实现的copy、toString等方法
  • componentN方法 ,可以自己写
val (a,b,c) = dataClass实例
例:
val person = Person("张丹",35)
    val (a,b) = person
    println("姓名:$a,年龄:$b")
  • allOpen和noArg插件,解决数据类被final修饰且没有空的构造函数的问题(dataClass是final,从设计角度上不允许有子类,通过allopen插件可是实现在编译期通过字节码的方式将fianl去掉,通过noArg插件可以实现无参构造方法)

group 'cn.onestravel'
version '1.0-SNAPSHOT'



buildscript {
    ext.kotlin_version="1.3.0"
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'kotlin-allopen'
apply plugin: 'kotlin-noarg'

noArg{
    annotation("net.println.demo1.DataBean")
}

allOpen{
    annotation("net.println.demo1.DataBean")
}

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"

}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

内部类

  • 定义在类内部的类,默认是静态内部类(java默认的是非静态内部类),非静态用inner关键字,与类成员有相似的访问控制
  • 内部类访问外部类的成员用@this@Outter,内部类的成员可以用this@Inner也可以不用。

匿名内部类

  • 没有定义名字的内部类
  • 类名编译时生成,类似Outter@1.class
  • 可以继承父类、实现多个接口(Java不能同时继承父类又实现接口,要么继承一个类,要么实现一个接口)

枚举(enmu)

  • 实例可数的类,注意枚举也是类
  • 可以修改构造,添加成员
  • 可以提升代码的表现力,也有一定的性能开销

密封类(sealed)

  • 子类可数(枚举是实例可数)
  • Kotlin v1.1之前子类必须定义在密封类的内部类
  • v1.1后,子类只需要与密封类在同一个文件中
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容