Kotlin

buildscript {

    ext.kotlin_version = '1.0.0'
    
    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'me.tatarka.retrolambda'

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
  • 推荐安装Kotlin Extensions For Android

Lambda

  1. 通过表达式代替@Functionalinterface(只包含一个方法的接口)
  2. 如果主体只有一条语句,可省略{}return语句后面的;
// 参数类型可写可不写
view.setOnClickListener((view) -> {});

基础

变量

  • 变量名在前,变量类型在后

  • 如果声明的时候赋值了就不用指定类型,会自动类型推导

  • val(final 常量)

    val a : Int = 1 // final int a = 1;
    
  • 变量默认都是@NotNull的,在类型后面加上?可以指定为@Nullable

    var b = 1           // int b = 1;
    var s : String?     // 可以为null
    

可以return null的函数,其返回类型都要加上?

数组

类型安全

  • is用于类型判断,相当于instanceof

    fun getStringLength(obj: Any) : Int? {
        if (obj is String) {
            // is判断内自动转为String类型,不需要强转
            return obj.length
        }
        
        // 离开类型判断分支后,仍然是Any类型
        return null;
    }
    
  • 字符串模版(EL表达式)

    "Hello ${name}"
    
  • if else替代三目运算符

    fun max(a : Int, b :Int) : Int? = if (a > b) a else b
    

函数

  • 如果函数返回Unit类型,可以忽略掉

    fun main(args : Array<String>): Unit {  // String[]
        println("hello world!");    // 分号可以省略
    }
    
  • 函数体只有一个表达式时可省略括号,返回值自动自动推断

    fun sum(a : Int, b : Int) = a + b;
    

相等

  • 引用相等

    a === b // a.identityEqual(b)
    
  • 结构相等

    a == b      // a?.equals(b) ?: b === null
    

For

  • in等价于foreach

    for ((k, v) in map) {
        println("$k -> $v")
    }
    
  • indices下标索引

    fun main(args : Array<String>) {
        for(i in args.indices) {
            print(args[i])
        }
    }
    
  • sizei()

    fun main(args : Array<String>) {
        var i = 0
        while(i < args.size()) {
            print(args[i++])
        }
    }
    

OOP

  1. 默认都是final

  2. package import和java一致,如果出现导入报名冲突可以使用as

    import foo.Bar
    import bar.Bar as bBar
    

构造函数

  1. 主构造函数只有一个,是类头的一部分跟在类名后面

    • 主构造函数的参数

      class Person (firstName: String) {
          init {} // 主构造函数初始化代码
      }
      
      // 等价于
      public final class Person {
          public Person(String name) {
              // init{}
          }
      }
      
    • 主构造函数 + 属性

      class Person(val name: String, var age: Int) {}
      
      // 等价于
      public final class Person {
          private final String name;
          private int age;
          
          public Person(@NotNull String name, int age) {}
          
          // getter setter
      }
      
    • 如果一个类没有声明任何构造函数,将会生成一个不带参数的主构造函数

  2. 二级构造函数,使用constructor

    class Person(val name: String) {
        constructor(name: String, parent: Person): this(name) {}
    }
    
  3. 创建实例:没有<del>new</del>关键字,直接调用构造函数

    val person = Pserson("ss");
    

属性

要使用属性只需要使用名称引用即可,就相当于java中的public字段


继承:

所有类的共同父类Any,不属于java.lang.Object,没有任何成员变量,甚至没有equals()hashCode()toString()

普通类

  1. 继承的类有主构造函数

    open class Base(p: Int) {}
    
    class Derived(p: Int) : Base(p) {}
    
  2. 没有主构造函数,那么每个二级构造函数使用super或者委托给另一个构造函数

    class MyView : View {
        
        constructor(context: Context) : super(context) {
        }
        
        constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        }
    }
    
  • 父类的函数必标注open(去掉java中的final关键字)否则子类不允许定义同名函数;因此父类类头上也要标注open
  • 函数必须加上override标注才能重写父类方法

抽象类 & 接口

单例

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,612评论 18 399
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,191评论 9 118
  • 【奇谈杂阅】设定具体而清晰的目标,能够提升达成率,所以一直颇受追捧,但近年来,研究者们发现,设定具体而清晰的目标往...
    奇妙的奇阅读 107评论 0 0
  • 通过采访15个朋友 我们了解到不同性别之间的看法 为此,我们从中挑选出以下观点 ♡ 只能说女生信任男生 不能说其他...
    我与男心阅读 79,895评论 2 1
  • 当我们自己爱的能量更多,我们自己的意识变得更加清醒! 最后请时刻记住蝴蝶。因为当我们看到了毛毛虫,只看到了毛毛虫在...
    悦纳悦心阅读 337评论 0 0